重新评估ModelState.IsValid属性

时间:2011-03-07 21:23:05

标签: asp.net-mvc validation

我正在尝试验证用户更改密码。此actionresult采用的PasswordChange类有4个属性。其中一个是databasePassword,它与“CurrentPassword”属性进行比较,确保用户只有在知道当前密码时才能更改密码(非常标准的网站访问)

我遇到的问题是数据库密码只在ActionResult内部设置(如图所示),但是ModelState似乎在此之前被调用,所以它在“IsValid”上返回false,因为它看到数据库密码为“NULL”,即使在数据库密码已设置

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult ChangePassword(PasswordChange model)
    {
        var User = GetPlayer().User;
        model.databasePassword = User.Password; 

        if (ModelState.IsValid)
        {
            //update the users password
            User.Updated = SystemDate.Current();
            User.Password = model.newPassword.ToLower();

            return Redirect("/Player");
        }
        else
        {
            return View(model);
        }
    }

我怎样才能重新评估或评估我想要的时间!

3 个答案:

答案 0 :(得分:2)

如果您的作业已修复,请检查错误并清除错误。简化检查:

model.databasePassword = User.Password;
if (ModelState["databasePassword"].Errors.Count == 1)
{
    ModelState["databasePassword"].Errors.Clear();
}

答案 1 :(得分:1)

创建一个PasswordChangeInput视图模型类并从视图中传递所需内容,然后可以从实体模型中单独进行验证。然后,在满意的输入数据有效后,您可以使用像automapper这样的东西将输入视图模型映射到实体模型。

要添加:您可以尝试清除ModelState错误,设置databasePassword并重新验证。可能更容易弄清楚是什么导致默认模型绑定器为databasePassword添加错误并更改它以使其无效。

答案 2 :(得分:0)

我知道这是一篇旧帖子,但我找到了另一种解决方案,可以帮助某些人在同一场景中挣扎。

Conditional Validation with Data Annotations in ASP.NET MVC

或通过创建ModelState扩展名

ASP.NET MVC - Excluding Model Validation Rules