ModelState.IsValid
表示从请求中正确绑定模型的传入值并且在模型绑定过程中是否有任何显式指定的验证规则被违反。
在您的示例中,正在绑定的模型属于类类型Encaissement
。 验证规则是通过使用属性、逻辑和添加到IValidatableObject
的Validate()
方法中的错误来指定模型的 - 或者仅仅在操作方法的代码中进行指定。
如果值能够正确地绑定到模型,并且在此过程中没有违反任何验证规则,则IsValid
属性将为true。
以下是如何在您的模型类上实现验证属性和IValidatableObject
的示例:
public class Encaissement : IValidatableObject
{
[Required(ErrorMessage = "The Encaissment ID must be submitted")]
public int EncaissementID { get; set; }
public DateTime? DateEncaissement { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
if (!this.DateEncaissement.HasValue)
{
results.Add(new ValidationResult("The DateEncaissement must be set", new string[] { "DateEncaissement" });
}
return results;
}
}
以下是一个示例,展示了如何在您的示例的操作方法中应用相同的验证规则:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "EncaissementID,libelle,DateEncaissement,Montant,ProjetID,Description")] Encaissement encaissement) {
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);
}
需要记住的是,模型属性的值类型也将得到验证。例如,不能将字符串值分配给int
属性。如果这样做,它将无法绑定,并且错误将添加到ModelState
中。
在您的示例中,EncaissementID
值无法接受一个"Hello"
的值,这将导致添加模型验证错误并使IsValid
为false。
出现上述任何原因(可能还有更多)都会导致模型状态的IsValid
布尔值为false
。