我在ASP.NET v5.2.2中使用Fluent Validation v5.5,我得到了一些与验证不一致的结果。Fluent验证与ASP.NET MVC不一致5
我的看法模式是:
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在可为空的枚举上性别似乎没有触发。
显式验证返回8个错误中的7个,LessThanOrEqualTo规则将不会触发,因为DateOfBirthYear默认为零。
我的痛点是我无法弄清楚为什么ModelState在可空可枚举Gender上缺少NotEmpty错误。
我能够触发该错误的唯一方法是仅发布性别值。
请帮忙。
编辑:
一些代码步进后,看来这个问题是关系到流利的验证RequiredFluentValidationPropertyValidator。 Gender字段是一个可为空的值类型,它绑定为null。从RequiredFluentValidationPropertyValidator下面的代码片段阻止验证:
ShouldValidate = isNonNullableValueType && nullWasSpecified;
何不干脆再检查一下这个RuleFor (x => x.Gender).NotNull()? – Zinov 2017-07-12 18:57:34