FluentValidation не работает с коллекцией внешних объектов модели - PullRequest
0 голосов
/ 10 ноября 2018

У меня проблемы с настройкой FluentValidation для работы с коллекцией объектов.Действие моего контроллера POST принимает IEnumerable объектов, как показано ниже.Когда я публикую сообщение для действия, которое принимает одно EventInputDto, с неправильно отформатированным свойством Url, моя проверка проходит успешно.Когда я публикую в коллекцию EventInputDto, она не работает и не проверяет.

Если я использую обычные атрибуты MVC (т. Е. Обязательные / по электронной почте), они работают как с коллекциями, так и с отдельными объектами.Как мне заставить это работать с FluentValidation?Я не работаю с внутренними коллекциями, поэтому я не уверен, почему он не работает должным образом.

public async Task<IActionResult> CreateEventCollection([FromBody] IEnumerable<EventInputDto> events)
{
    if (!ModelState.IsValid)
    {
    return UnprocessableEntity(ModelState); //does not work
    }
}

Мои валидаторы настроены с использованием универсальных шаблонов, потому что я использую отдельные модели для входных данных и обновлений.

public class EventManipulationValidator<T> : AbstractValidator<T> where T : EventManipulationDto
    {
        public EventManipulationValidator()
        {
            RuleFor(manipulationDto => manipulationDto.Title).NotNull().WithMessage("Title cannot be blank")
              .Length(1, 50);

            RuleFor(manipulationDto => manipulationDto.Message).NotNull().WithMessage("Message cannot be blank")
                  .Length(1, 1000);

            RuleFor(manipulationDto => manipulationDto.ScheduledTime).NotNull().WithMessage("Scheduled Time cannot be blank");

            RuleFor(inputDto => inputDto.Url).Matches(@"https://.*windows\.net.*").WithMessage("The url must be valid and stored on Azure");
        }
    }

Поскольку мое действие CreateEventCollection принимает IEnumerable EventInputDto, мой валидатор для EventInputDto настроен следующим образом:

public class EventInputValidator : EventManipulationValidator<EventInputDto>
    {
        public EventInputValidator()
        {
            //all property validators are inherited from EventManipulationValidator
        }
    }
    public class EventInputCollectionValidator : AbstractValidator<IEnumerable<EventInputDto>>
    {
        public EventInputCollectionValidator()
        {
            RuleForEach(p => p).SetValidator(new EventManipulationValidator<EventInputDto>());
        }
    }

Ниже приведены мои модели для справки:

EventManipulationDto

public abstract class EventManipulationDto
    {
        public string Title { get; set; }
        public string Message { get; set; }
        public string Url { get; set; }
        public DateTime? ScheduledTime { get; set; }
    }

EventInputDto

 public class EventInputDto : EventManipulationDto
  {
     //all properties inherited from base class
   }

1 Ответ

0 голосов
/ 10 ноября 2018

После просмотра списка открытых / закрытых вопросов по проекту GitHub, кажется, что не весь мой подход необходим. Там нет необходимости для моего `EventInputCollectionValidator. FluentValidation больше не требует явного определения валидатора IEnumerable, как я определил выше.

Достаточно определить базовый AbstractValidator или, как в моем случае, унаследованный валидатор из родительского класса.

Единственное изменение, необходимое для его работы, было в моем файле startup.cs при регистрации fluentvalidation. Мне нужно было явно добавить ImplicitlyValidateChildProperties = true. Не осознавал, что это необходимо, так как я думал, что это для проверки коллекций дочерних свойств, а не объектов родительской коллекции. Отлично работает сейчас.

.AddFluentValidation(fv => {
                    fv.RunDefaultMvcValidationAfterFluentValidationExecutes = true;
                    fv.RegisterValidatorsFromAssemblyContaining<Startup>();
                    fv.ImplicitlyValidateChildProperties = true;
                }); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...