ModelState.IsValid做什么?

当我做一个create方法时,我在参数中绑定我的对象,然后检查ModelState是否有效,所以我添加到数据库:

但是当我在添加到数据库之前需要更改某些内容时(在我更改它之前, ModelState无效,所以我必须这样做)为什么模型状态仍然无效。

这个function究竟检查了什么?

这是我的例子:

 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "EncaissementID,libelle,DateEncaissement,Montant,ProjetID,Description")] Encaissement encaissement) { encaissement.Montant = Convert.ToDecimal(encaissement.Montant); ViewBag.montant = encaissement.Montant; if (ModelState.IsValid) { db.Encaissements.Add(encaissement); db.SaveChanges(); return RedirectToAction("Index", "Encaissement"); }; ViewBag.ProjetID = new SelectList(db.Projets, "ProjetId", "nomP"); return View(encaissement); } 

ModelState.IsValid指示是否可以正确地将请求中的传入值绑定到模型,以及在模型绑定过程中是否中断了任何显式指定的validation规则。

在您的示例中,绑定的模型是类类型Encaissement 。 validation规则是通过使用IValidatableObjectValidate()方法中添加的属性,逻辑和错误在模型上指定的规则 – 或者仅仅是在操作方法的代码中。

如果值能够正确绑定到模型并且过程中没有破坏validation规则,则IsValid属性将为true。

以下是如何在模型类上实现validation属性和IValidatableObject的示例:

 public class Encaissement : IValidatableObject { // A required attribute, validates that this value was submitted [Required(ErrorMessage = "The Encaissment ID must be submitted")] public int EncaissementID { get; set; } public DateTime? DateEncaissement { get; set; } public IEnumerable Validate(ValidationContext validationContext) { var results = new List(); // Validate the DateEncaissment if (!this.DateEncaissement.HasValue) { results.Add(new ValidationResult("The DateEncaissement must be set", new string[] { "DateEncaissement" }); } return results; } } 

以下是在示例的操作方法中如何应用相同validation规则的示例:

 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create([Bind(Include = "EncaissementID,libelle,DateEncaissement,Montant,ProjetID,Description")] Encaissement encaissement) { // Perform validation if (!encaissement.DateEncaissement.HasValue) { this.ModelState.AddModelError("DateEncaissement", "The DateEncaissement must be set"); } encaissement.Montant = Convert.ToDecimal(encaissement.Montant); ViewBag.montant = encaissement.Montant; if (ModelState.IsValid) { db.Encaissements.Add(encaissement); db.SaveChanges(); return RedirectToAction("Index", "Encaissement"); }; ViewBag.ProjetID = new SelectList(db.Projets, "ProjetId", "nomP"); return View(encaissement); } 

值得注意的是,模型属性的值类型也将得到validation。 例如,您不能将字符串值分配给int属性。 如果这样做,它将不受约束,并且错误也将添加到您的ModelState

在您的示例中, EncaissementID值不能EncaissementID发布"Hello"值,这将导致添加模型validation错误并且IsValid将为false。

由于上述任何原因(可能更多),模型状态的IsValid bool值将为false

ModelState.IsValid将基本上告诉您,根据添加到模型属性的数据注释,是否将数据发布到服务器有任何问题。

例如,如果您有[Required(ErrorMessage = "Please fill")] ,并且在将表单发布到服务器时该属性为空,则ModelState将无效。

ModelBinder还会为您检查一些基本的东西。 例如,如果您有一个BirthDate日期选择器,并且此选择器绑定到的属性不是可为空的DateTime类型,那么如果您将日期保留为空,则ModelState也将无效。

在这里 , 这里有一些有用的post要阅读。

你可以在这里找到关于ModelState及其用途的精彩文章。

具体来说, IsValid属性是检查ModelState.Errors是否存在任何字段validation错误的快速方法。 如果您不确定在POST到控制器方法时导致模型无效的原因,您可以检查ModelState.Errors属性,该属性应至少产生一个表单validation错误。