【问题标题】:ModelState.IsValid does not exclude required propertyModelState.IsValid 不排除必需的属性
【发布时间】:2010-07-02 14:26:18
【问题描述】:

我试图排除一个必需的属性(密码),所以模型状态不验证该属性,但由于某种原因,即使我尝试排除它,它仍然有效。

控制器:

    [Authorize, AcceptVerbs(HttpVerbs.Post)]
    public ActionResult _Edit(int id, [Bind(Exclude = "Password")]FormCollection collection)
    {
        var user = Proxy.GetUser(id);

        TryUpdateModel(user, null, null, new[]{"Password"});

        if(!ModelState.IsValid)
            return PartialView(user);

        Proxy.UpdateUser(user);
    }

查看:

   ...
   <tr>
       <td class="label">
           <label class="row_description" for="Password"><%= S._("Password")%></label>
       </td>
       <td>
           <%= Html.Password("Password", null, new { @class = "row_input" })%>
           <%= Html.ValidationMessage("Password", "*")%>
       </td>
   </tr>

用户(使用数据注解):

[Required]
public string Password { get; set; }

我用的是VS2008、MVC2、firefox

也许我只是累了,看不到它。任何帮助表示赞赏

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    好像我回复太晚了,但我也遇到了同样的问题。

    检查您的ModelState.Keys 收藏。密钥可能采用 modelObjectName.Password 的形式,其余模型属性的形式相同。

    所以在这种情况下ModelState.Remove("Password") 将不起作用。你应该试试ModelState.Remove("modelObjectName.Password")

    希望这能解决某人的问题:)

    【讨论】:

      【解决方案2】:

      我目前在使用 MVC3 时遇到了类似的问题。

      尽管[Bind(Exclude = "Password")] 在我的操作中,ModelState.IsValid 仍然返回 false。

      我注意到TryUpdateModel(user, null, null, new string[]{"Password"}); 已成功更新模型;但是仍然返回错误。然后我发现TryUpdateModel实际上返回ModelState.IsValid(在stackoverflow上的某个地方,很抱歉没有链接)。

      因此,问题不在于TryUpdateModel,而在于ModelState.IsValid

      注意:这也意味着您不需要验证两次...您可以使用此代码:

      if (!TryUpdateModel(user, null, null, new string[]{"Password"}))
          return PartialView(user);
      

      因此,问题看起来好像 ModelState 仍在验证已从您的 FormCollection 中排除的属性。

      我能够通过在调用TryUpdateModel 之前从ModelState 中删除该字段来克服这个问题:

      ModelState.Remove("Password");
      

      请注意,TryUpdateModel 仍然需要根据上述代码从更新中排除的属性列表。

      【讨论】:

      • 我也在为此苦苦挣扎。当它显然应该被排除时,执行 ModelState.Remove 似乎很骇人听闻。谁能解释一下为什么 MC3 验证忽略 Bind(Exclude=)?
      • @James:我同意,TryUpdateModel 排除 excludeProperty 中列出的属性似乎有点违反直觉,但 IsValid 不排除 Bind(Exclude)(或 excludeProperty)中列出的属性.
      • 我想我找到了答案:bradwilson.typepad.com/blog/2010/01/…
      【解决方案3】:

      你可以使用这样的扩展方法:

      public static bool IsValidExclude(this ModelStateDictionary modelState, params string[] exclude)
      {
          foreach (var key in exclude)
          {
              if (modelState.ContainsKey(key))
                  modelState.Remove(key);
          }
      
          return modelState.All(m => m.Value.Errors.Count == 0);
      }
      

      然后只需调用:

      var result = ModelState.IsValidExclude("Password");
      

      【讨论】:

        【解决方案4】:

        我在 ASP .NET MVC 2 中使用以下方法取得了成功

        TryUpdateModel(user);
        ModelState.Remove("Password");
        if (!ModelState.IsValid) return PartialView(user);
        

        要防止 TryUpdate 绑定到某些模型属性,您可以创建一个包含模板,如下所示:

        public interface IUserValidateBindable
        {
            string UserId { get; set; }
        }
        
        public class User : IUserValidateBindable
        {
            [Required]
            public string UserId { get; set; }
            [Required]
            public string Password { get; set; }
        }
        

        更新 TryUpodateModel 调用如下:

        TryUpdateModel<IUserValidateBindable>(user);
        

        【讨论】:

          【解决方案5】:

          也许你应该替换

          TryUpdateModel(user, null, null, new[]{"Password"});
          

          TryUpdateModel(user, null, null, new string[] {"Password"});
          

          因为可能会混淆 TryUpdateModel 使用的是哪个重载。 只是说...

          【讨论】:

          • 感谢回复,但我认为我的问题与我使用相同的模型进行创建和编辑有关。我希望在创建时需要密码,但在编辑时不需要。白/黑名单显然与模型状态有效无关:D
          【解决方案6】:

          我成功地将[Bind(Exclude = "Property")]ModelState.Remove("Property") 一起使用,效果非常好。

          【讨论】:

            【解决方案7】:

            在我的情况下,我在 modelstate.isValid 上遇到错误,删除它在 webapi asp.net mvc 中对我不起作用,然后我跟踪错误

            然后我添加模型ModelState.Remove("model.Description");,我将模型定义为参数,然后我使用参数名称,然后模型状态为我工作,如下所示:

            【讨论】:

              猜你喜欢
              • 2015-03-26
              • 2019-05-27
              • 1970-01-01
              • 2020-06-09
              • 1970-01-01
              • 2017-06-19
              • 1970-01-01
              • 2019-08-15
              • 2016-06-25
              相关资源
              最近更新 更多