ModelState.IsValid做什么?

时间:2016-04-27 15:08:44

标签: c# asp.net-mvc

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

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

这个功能究竟检查了什么?

这是我的例子:

ModelState

3 个答案:

答案 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也将无效。

Herehere是一些有用的帖子。

答案 2 :(得分:2)

您可以在ModelState上找到一篇很好的文章,并使用here

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

相关问题