У меня проблемы с настройкой 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
}