C# ASP.NET中的ModelStateDictionary如何知道要验证哪个模型?
以生成的这段代码为例:C# ASP.NET中的ModelStateDictionary如何知道要验证哪个模型?,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,以生成的这段代码为例: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit(Bill bill) { if (ModelState.IsValid) { db.Entry(bill).State = EntityState.Modified; db.SaveChanges(); retur
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Bill bill)
{
if (ModelState.IsValid)
{
db.Entry(bill).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(bill);
}
有一个名为“Bill”的模型,它为它设置了一些[必需的]属性
我的问题是:ModelState.IsValid如何知道它应该检查票据实体而不是另一个实体?ASP.NET MVC中有一个名为
DefaultModelBinder
的默认模型绑定器。此类将为您定义的每个操作参数自动执行。当它试图从请求键/值字符串对实例化和填充相应的模型时,可能会遇到此模型绑定器简单地添加到ModelState
字典中的错误。它可能会遇到错误的原因是您可能已使用验证属性装饰了模型
因此,一旦代码执行进入控制器操作,ModelState.IsValid
属性将返回false,如果在模型绑定期间添加了错误
顺便说一句,您的代码等同于以下内容(请勿使用,仅用于说明目的):
Edit
方法具有类型为bill
的bill
参数。。。这就是为什么MVC知道它应该验证Bill
类型,所以它只读取参数?如果我想在这个上下文之外使用ModelStateDictionary(比如一个helper类中没有参数的方法),那该怎么办?更清楚一点,MVC使用反射查看action方法的参数,然后遍历通过方法参数传递的对象的公共属性。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit()
{
Bill bill = new Bill();
if (TryUpdateModel(bill))
{
db.Entry(bill).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(bill);
}