2014-12-06 109 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