Fluent验证与ASP.NET MVC不一致5
我在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;
!ModelState.IsValid
不使用您的验证结果,它使用defaulf 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();
}
我的问题的症结在于可否定性别字段未被验证的事实。我只是包括明确的验证“结果”进行比较。我上面显示的代码是为了说明验证中的不一致性。我的Application_Start方法包含上面提到的代码,因此Fluent Validation完全集成为验证提供程序。 – Rudy 2014-12-06 16:55:42
何不干脆再检查一下这个RuleFor (x => x.Gender).NotNull()? – Zinov 2017-07-12 18:57:34