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);
}