2011-03-07 89 views
5

我想验证用户更改其密码。这个动作结果所需的PasswordChange类有4个属性。其中之一是数据库密码,即时通讯与一个“CurrentPassword”属性进行比较,确保用户只有在知道他们当前的密码时才能更改密码(网站上的标准流程)重新评估ModelState.IsValid属性

问题我有数据库密码是集(如图所示)的ActionResult不过的ModelState内似乎得到所谓在此之前,因此返回的“IsValid的”假,因为它看到数据库密码为“空”的数据库密码设置

[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); 
     } 
    } 

怎么连后我可以重新评估它,或者让它评估我想要的时间!

回答

1

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

要添加:您可以尝试清除ModelState错误,设置databasePassword并重新验证。找出导致默认模型联编程序为databasePassword添加错误并将其更改为无效的原因可能更容易一些。

+0

这几乎是PasswordChange是什么。它几乎是一个有4个属性的视图模型。 3从页面上的数据库中设置的页面..这并不能解决问题与获得modelstate后验证! – Steve 2011-03-07 21:51:57

+0

好吧,愚蠢的问题,但为什么databasePassword需要是一个模型属性,如果CurrentPassword是? – 2011-03-07 22:01:53

+0

如果您在视图传递回来之后添加内容,它实际上不是视图的模型。这就是为什么我问为什么PasswordChange需要databasePassword。 – 2011-03-07 22:07:15

2

检查错误并清除它,如果您分配固定它。简单的检查:

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

这是最佳做法吗? – FutuToad 2013-03-08 23:39:43