[英]Fluent Validation Inconsistent with 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性别似乎没有触发。
显式验证返回8个错误中的7个,因为DateOfBirthYear默认为零,所以LessThanOrEqualTo规则不会触发。
我的痛点是我无法弄清楚为什么ModelState在可空的enum Gender上缺少NotEmpty错误。
我能够触发该错误的唯一方法是仅发布Gender值。
请帮忙。
编辑:
单步执行某些代码后,问题似乎与Fluent验证RequiredFluentValidationPropertyValidator有关。 Gender字段是一个可为空的值类型,它绑定为null。 RequiredFluentValidationPropertyValidator的以下片段阻止验证:
ShouldValidate = isNonNullableValueType && nullWasSpecified;
!ModelState.IsValid
不使用您的验证结果,它使用defaulf MVC验证(可以通过DataAnnotations
添加)。 你必须检查!results.IsValid
,它包含你的QuoteValidator
的验证结果。
如果要使用默认的ModelState.IsValid
,则必须使用validator属性标记模型:
[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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.