【问题标题】:Perform validation on hidden fields对隐藏字段执行验证
【发布时间】:2012-04-25 13:15:52
【问题描述】:

我有以下观点:

    @Html.LabelFor(m => m.CompanyPostCode)
    @Html.TextBoxFor(m => m.CompanyPostCode)

    @Html.LabelFor(m => m.CompanyCity)
    @Html.TextBoxFor(m => m.CompanyCity)

    @Html.HiddenFor(m => m.CompanyCityID)

在我的视图模型中,所有属性都标记为 [必需]。然后问题是我的 CompanyCityID(标记为必需)被隐藏,因此在视图中没有进行验证。如果我在视图中显示此属性,则验证完成。

我的问题:是否可以对隐藏字段执行验证?是否存在解决方法?

验证隐藏字段可能看起来有点奇怪。原因是该字段是根据特殊规则从 jQuery 填充的。如果未填充,我知道视图中的某些内容无效。

谢谢。

【问题讨论】:

    标签: jquery asp.net-mvc asp.net-mvc-3 validation


    【解决方案1】:

    可能的原因是jquery.validate.unobtrusive.js文件中有ignore: ':hidden'这一行。

    在 1.9.0 版本之后,这是默认行为。您可以通过添加手动修复该问题

    $.validator.setDefaults({ ignore: [] });
    

    如你所见here

    另一个改变应该是设置带有隐藏元素的表单 更简单,这些现在默认被忽略(选项“忽略”有 “:hidden”现在是默认的)。从理论上讲,这可能会破坏现有的 设置。在不太可能的情况下,您可以通过以下方式修复它 将忽略选项设置为“[]”(方括号不带 引号)。

    【讨论】:

    • 我真的很讨厌成为那个纠正人们但忽略设置不是由 jquery.validate.unobtrusive.js 设置的人。此外,在使用 setDefaults 之前,请注意它的工作原理。如果您在连接表单验证之后设置默认值,那么您使用此调用为时已晚。请参阅我的文章以获得更深入的解释。 stackoverflow.com/questions/8466643/…
    • @JustinMichaels,自从我写下这个答案后,也许有些事情发生了变化。当时我检查了 jquery.validate.unobtrusive.js 并忽略了设置。
    • 很好的答案,我找了大概 3 个小时……“谢谢你,查克·诺里斯!” (就像文斯·沃恩的电影《躲避球》)
    • 嘿,等一下,你还太年轻,不能成为 Chuck Norris!
    • 请记住,您不要$.validator.setDefaults({ ignore: [] }); 放在$(document).ready 中,因为这为时已晚。如果您不能这样做,请使用:$('form').validate().settings.ignore = []
    【解决方案2】:

    您也可以只在 jquery.validate.js 文件中注释掉这一行。 忽略:“:隐藏”

    【讨论】:

    • 对 Chuck Norris 的重复回答
    【解决方案3】:

    如果您不必在控制器中和相关视图的操作中使用 javascript,则可以在验证模型之前添加模型错误。示例:

     [HttpPost]
            public ActionResult Fix(YourModel mdl)
        {
    
        if (mdl.CompanyCityID==0)
            ModelState.AddModelError("", "Your error message!");
    
        if (ModelState.IsValid)
        {
    
    
           //
           //Some code
           //
    
            return View("YourView", yourlist);
        }
    
        return View(mdl);
    }
    

    【讨论】:

      【解决方案4】:

      您总是可以将@Html.HiddenFor(m => m.CompanyCityID) 放在隐藏的 div 中并将其更改为EditorFor()

      CSS

      .hidden {
          display: none;
      }​
      

      查看

      <div class="hidden">
              @Html.EditorFor(m => m.CompanyCityID)
      </div
      

      【讨论】:

      • 这似乎不起作用。我认为它仍然可以分辨出它是隐藏的,即使它是隐藏的父级。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      相关资源
      最近更新 更多