2014-12-06 84 views
2

我在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; 
+0

何不干脆再检查一下这个RuleFor (x => x.Gender).NotNull()? – Zinov 2017-07-12 18:57:34

回答

2

!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(); 
} 
+0

我的问题的症结在于可否定性别字段未被验证的事实。我只是包括明确的验证“结果”进行比较。我上面显示的代码是为了说明验证中的不一致性。我的Application_Start方法包含上面提到的代码,因此Fluent Validation完全集成为验证提供程序。 – Rudy 2014-12-06 16:55:42