【问题标题】:Re-evaluate the ModelState.IsValid property重新评估 ModelState.IsValid 属性
【发布时间】:2011-03-07 21:23:05
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: asp.net-mvc validation


    【解决方案1】:

    检查错误并在您的作业修复后清除它。简化检查:

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

    【讨论】:

      【解决方案2】:

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

      补充:您可以尝试清除 ModelState 错误,设置 databasePassword,然后重新验证。找出导致默认模型绑定器为 databasePassword 添加错误并更改它以使其不会出现的原因可能更容易。

      【讨论】:

      • PasswordChange 就是这样。它几乎是一个具有 4 个属性的视图模型。 3来自发布页面上数据库的一组页面..这并不能解决让模型状态在之后进行验证的问题!
      • 好吧,愚蠢的问题,但是如果 CurrentPassword 是,为什么 databasePassword 需要是模型属性?
      • 如果你在从视图传回后添加东西,它真的不是视图的模型。这就是为什么我问为什么在 PasswordChange 上需要 databasePassword。
      • 好吧,这更像是一个验证模型。但如果失败,它将被传递回页面。所以从某种意义上说,它是一个模型视图......问题来了,我想什么时候验证模型视图我需要向它添加更多对象来验证。我想在验证中而不是期待数据库密码,我可以自己将其从数据库中提取出来。
      • 除非我不明白,只需从 PasswordChange 模型中删除 databasePassword 并在 if (ModelState.IsValid) 之前测试 CurrentPassword == User.Password,如果不是,您可以使用 ModelState.AddModelError ();
      【解决方案3】:

      我知道这是一篇旧帖子,但我找到了另一种解决方案,可以帮助遇到相同情况的人。

      Conditional Validation with Data Annotations in ASP.NET MVC

      或通过创建 ModelState 扩展

      ASP.NET MVC - Excluding Model Validation Rules

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 2020-10-14
        • 2016-03-02
        • 1970-01-01
        • 2012-02-25
        • 2020-08-19
        • 1970-01-01
        相关资源
        最近更新 更多