我正在使用FluentValidation MVC5来验证对象。我跟着这个tutorial。当我发布表单时,为什么MVC DefaultModelBinder不验证对象? FluentValidationModelValidatorProvider已在global.asax
中配置Global.asax中
protected void Application_Start()
{
FluentValidationModelValidatorProvider.Configure();
}
在web.config中将ClientValidationEnabled和UnobtrusiveJavaScriptEnabled设置为true。 我还下载了最新的jquery.validation包,添加到BundleConfig,并在其视图(Create.cshtml)中添加了
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
CurrencyViewModel.cs
[Validator(typeof(CurrencyViewModelValidator))]
public class CurrencyViewModel
{
public int CurrencyID { get; set; }
public string Code { get; set; }
public string Name { get; set; }
}
public class CurrencyViewModelValidator : AbstractValidator<CurrencyViewModel>
{
public CurrencyViewModelValidator()
{
RuleFor(x => x.Code).Length(3);
RuleFor(x => x.Name).Length(3, 50);
}
}
CurrencyController.cs
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CurrencyViewModel currencyVM)
{
if (ModelState.IsValid)
{
Currency currency = new Currency()
{
Code = currencyVM.Code,
Name = currencyVM.Name
};
db.Currencies.Add(currency);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(currencyVM);
}
答案 0 :(得分:1)
货币值为空,但ModelState.IsValid为true,很奇怪。
这是完全正常的行为。验证器检查字符串长度,而不是属性是否为null。 Documentation:
确保特定字符串属性的长度在指定范围内。
如果您不想允许空值,则应使用NotNull验证器:
RuleFor(x => x.Code).NotNull().Length(3);
RuleFor(x => x.Name).NotNull().Length(3, 50);