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规则是通过使用IValidatableObject
的Validate()
方法中添加的属性,逻辑和错误在模型上指定的规则 – 或者仅仅是在操作方法的代码中。
如果值能够正确绑定到模型并且过程中没有破坏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错误。