MVC的DefaultModelBinder不验证对象

时间:2014-04-15 07:42:40

标签: c# asp.net-mvc asp.net-mvc-5 fluentvalidation

我正在使用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);
}

1 个答案:

答案 0 :(得分:1)

  

货币值为空,但ModelState.IsValid为true,很奇怪。

这是完全正常的行为。验证器检查字符串长度,而不是属性是否为null。 Documentation

  

确保特定字符串属性的长度在指定范围内。

如果您不想允许空值,则应使用NotNull验证器:

RuleFor(x => x.Code).NotNull().Length(3);
RuleFor(x => x.Name).NotNull().Length(3, 50);