Плавная проверка несовместима с ASP.NET MVC 5

Я использую 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;

person Rudy    schedule 06.12.2014    source источник
comment
почему бы просто не проверить это RuleFor (x = ›x.Gender) .NotNull ()?   -  person Zinov    schedule 12.07.2017


Ответы (1)


!ModelState.IsValid не использует ваш результат проверки, он использует проверку MVC по умолчанию (которую можно добавить с помощью DataAnnotations). Вместо этого вы должны проверить !results.IsValid, который содержит результат проверки вашего QuoteValidator.

Если вы хотите использовать ModelState.IsValid по умолчанию, вы должны пометить свою модель атрибутом валидатора:

[Validator(typeof(QuoteValidator))]
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; }
}

И добавьте следующую строку в свой метод Application_Start:

protected void Application_Start() {
    FluentValidationModelValidatorProvider.Configure();
}
person Alex Art.    schedule 06.12.2014
comment
Суть моего вопроса связана с тем, что поле Gender, допускающее значение NULL, не проверяется. Я просто включаю явные результаты проверки для сравнения. Код, который я показал выше, создан, чтобы проиллюстрировать несогласованность при проверке. Мой метод Application_Start включает в себя код, который вы указали выше, поэтому Fluent Validation полностью интегрирован в качестве поставщика проверки. - person Rudy; 06.12.2014