我正在尝试验证用户更改密码。此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);
}
}
我怎样才能重新评估或评估我想要的时间!
答案 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扩展名