我在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