当我执行create方法时,我在参数中绑定了我的对象,然后检查ERR_INVALID_STOPS
是否有效,所以我添加到数据库中:
但是当我在添加到数据库之前需要更改某些内容时(在我更改之前,ModelState
无效,所以我必须这样做)
为什么模型状态仍然无效。
这个功能究竟检查了什么?
这是我的例子:
ModelState
答案 0 :(得分:21)
ModelState.IsValid指示是否可以正确地将请求中的传入值绑定到模型,以及在模型绑定过程中是否破坏了任何显式指定的验证规则。
在您的示例中,绑定的模型是类类型Encaissement
。验证规则是通过使用IValidatableObject
的{{1}}方法中添加的属性,逻辑和错误在模型上指定的规则,或者仅仅是在操作方法的代码中。
如果值能够正确绑定到模型并且在此过程中没有破坏验证规则,则Validate()
属性将为true。
以下是如何在模型类上实现验证属性和IsValid
的示例:
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<ValidationResult> Validate(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
// Validate the DateEncaissment
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) {
// 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);
}
属性。如果您这样做,它将不受约束,并且错误也将添加到您的int
。
在您的示例中,ModelState
值未能发布EncaissementID
值,这会导致添加模型验证错误,"Hello"
将为false。< / p>
出于上述任何原因(可能更多),模型状态的IsValid
bool值将为IsValid
。
答案 1 :(得分:12)
ModelState.IsValid
基本上会告诉您,根据添加到模型属性的数据注释,您的数据是否存在发布到服务器的任何问题。
例如,如果您有一个[Required(ErrorMessage = "Please fill")]
,并且在将表单发布到服务器时该属性为空,则ModelState将无效。
ModelBinder还会为您检查一些基本内容。例如,如果您有一个BirthDate日期选择器,并且此选择器绑定到的属性不是可为空的DateTime
类型,那么如果您将日期留空,则ModelState也将无效。
答案 2 :(得分:2)
您可以在ModelState上找到一篇很好的文章,并使用here。
具体来说,IsValid
属性是检查ModelState.Errors
中是否存在任何字段验证错误的快速方法。如果您不确定在POST到控制器方法时导致模型无效的原因,您可以检查ModelState.Errors
属性,该属性应至少产生一个表单验证错误。