Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 重新计算ModelState.IsValid属性_Asp.net Mvc_Validation - Fatal编程技术网

Asp.net mvc 重新计算ModelState.IsValid属性

Asp.net mvc 重新计算ModelState.IsValid属性,asp.net-mvc,validation,Asp.net Mvc,Validation,我正在尝试验证更改密码的用户。此actionresult采用的PasswordChange类有4个属性。其中一个是databasePassword,我将其与“CurrentPassword”属性进行比较,后者确保用户只有在知道当前密码的情况下才能更改密码(网站上的标准程序) 我遇到的问题是,数据库密码仅在ActionResult中设置(如图所示),但ModelState似乎在此之前被调用,因此它在“IsValid”上返回false,因为即使在设置了数据库密码之后,它也会将数据库密码视为“NULL

我正在尝试验证更改密码的用户。此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);
        }
    }

我怎样才能重新评估它,或者让它在我想要的时候进行评估

创建一个PasswordChangeInput视图模型类,并从视图中传入所需的内容,然后可以从实体模型中进行单独的验证。然后,在输入数据有效后,可以使用automapper之类的工具将输入视图模型映射到实体模型


添加:您可以尝试清除ModelState错误,设置数据库密码,然后重新验证。可能更容易找出是什么原因导致默认模型绑定器为databasePassword添加错误,并将其更改为不存在错误。

我知道这是一篇老文章,但我找到了另一种解决方案,可能有人在同一场景中遇到困难

或者通过创建ModelState扩展


检查错误,如果您的作业修复了错误,请将其清除。简化支票:

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

这与PasswordChange差不多。它几乎是一个视图模型,有4个属性。3从第1页开始,从post页上的数据库开始设置。。这并不能解决让modelstate在事后进行验证的问题!好的,愚蠢的问题,但是如果CurrentPassword是,为什么databasePassword需要是一个模型属性呢?如果在从视图传回数据后向其添加内容,那么它实际上不是视图的模型。这就是为什么我问为什么PasswordChange上需要databasePassword。好吧,公平点说,它更像是一个验证模型。但如果失败,它将被传递回页面。所以从某种意义上说,它是一个模型视图。。。问题来了,我想什么时候验证modelview,我需要添加更多的对象来进行验证。我想在验证过程中,我不需要databasepassword,我可以自己将其从数据库中取出。除非我不理解某些内容,只需从PasswordChange模型中删除databasepassword,然后在if(ModelState.IsValid)之前测试CurrentPassword==User.Password,如果没有,则可以使用ModelState.AddModelError();