Я использую Fluent Validation v5.5 с ASP.NET v5.2.2 и получаю противоречивые результаты с проверкой.
Моя модель просмотра:
public class QuoteViewModel
{
[Display(Name = @"Day")]
public int DateOfBirthDay { get; set; }
[Display(Name = @"Month")]
public int DateOfBirthMonth { get; set; }
[Display(Name = @"Year")]
public int DateOfBirthYear { get; set; }
[Display(Name = @"Gender")]
public Gender? Gender { get; set; }
[Display(Name = @"State")]
public int StateId { get; set; }
}
Мой метод контроллера:
public ActionResult Quote(QuoteViewModel viewModel)
{
var _validator = new QuoteValidator();
var results = _validator.Validate(viewModel);
if (!ModelState.IsValid)
{
return Json(false);
}
return Json(true);
}
Мой валидатор:
public class QuoteValidator : AbstractValidator<QuoteViewModel>
{
public QuoteValidator()
{
RuleFor(x => x.Gender).NotEmpty();
RuleFor(x => x.StateId).NotEmpty();
RuleFor(x => x.DateOfBirthDay).NotEmpty().InclusiveBetween(1, 31);
RuleFor(x => x.DateOfBirthMonth).NotEmpty().InclusiveBetween(1, 12);
RuleFor(x => x.DateOfBirthYear).NotEmpty().LessThanOrEqualTo(DateTime.UtcNow.Year);
}
}
Я запускаю тест, в котором публикуются все пустые поля формы значений. Таким образом, поля модели представления сохраняют значения по умолчанию после создания объекта модели представления.
Для сравнения: в контроллере я выполняю проверку явно, и результаты не согласуются с результатом проверки в ModelState.
ModelState показывает 4 ошибки, все вызванные правилами NotEmpty. NotEmpty в перечислении с нулевым значением Gender, похоже, не запускается.
Явная проверка возвращает 7 из 8 ошибок, правило LessThanOrEqualTo не срабатывает, поскольку значение DateOfBirthYear по умолчанию равно нулю.
Моя проблема в том, что я не могу понять, почему в ModelState отсутствует ошибка NotEmpty в перечислении Gender, допускающем значение NULL.
Единственный способ вызвать эту ошибку - опубликовать только значение Gender.
Пожалуйста помоги.
РЕДАКТИРОВАТЬ:
После прохождения некоторого кода кажется, что проблема связана с Fluent Validation RequiredFluentValidationPropertyValidator. Поле Gender - это тип значения, допускающий значение NULL, который привязан к NULL. Следующий фрагмент из RequiredFluentValidationPropertyValidator предотвращает проверку:
ShouldValidate = isNonNullableValueType && nullWasSpecified;