如何更新ModelState?

时间:2011-01-31 19:42:28

标签: c# asp.net-mvc

这是我用ajax post方法调用的控制器动作:

    [HttpPost]
    public ActionResult Add(Comment comment)
    {
        if (User.Identity.IsAuthenticated)
        {
            comment.Username = User.Identity.Name;
            comment.Email = Membership.GetUser().Email;
        }

        if (ModelState.IsValid)
        {
            this.db.Add(comment);
            return PartialView("Comment", comment);
        }
        else
        {
            //...
        }
    }

如果用户已登录,则提交表单没有“用户名”和“电子邮件”字段,因此它们不会被ajax调用传递。当action被调用时,ModelStat.IsValid返回false,因为这两个属性是必需的。将有效值设置为属性后,如何触发模型验证以更新ModelState?

2 个答案:

答案 0 :(得分:4)

您可以尝试调用内置的TryUpdateModel方法,该方法返回一个布尔值,以便您可以检查该值。

更新:尝试使用TryUpdateModel和异常。使用formcollection而不是Comment to Action。

[HttpPost]
    public ActionResult Add(FormCollection collection)
    {

        string[] excludedProperties = new string[] { "Username". "Email" };
        var comment = new Comment();
        if (User.Identity.IsAuthenticated)
        {
            comment.Username = User.Identity.Name;
            comment.Email = Membership.GetUser().Email;
        }

        TryUpdateModel<Comment>(comment, "", null, excludedProperties, collection.ToValueProvider());

        if (ModelState.IsValid)
        {
            this.db.Add(comment);
            return PartialView("Comment", comment);
        }
        else
        {
            //...
        }
    }

答案 1 :(得分:4)

您可以使用自定义model binder绑定来自User.Identity的评论的用户名和电子邮件属性。因为绑定在验证之前发生,所以ModelState将是有效的。

另一种选择是为Comment类实现自定义model validator,以检查ControllerContext.Controller是否有经过验证的用户。

通过实施任何这些选项,您可以删除第一个if if。