对隐藏字段进行验证

17

我有以下视图:

    @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)

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

enter image description here

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

可能在隐藏字段上进行验证看起来有点奇怪。原因是该字段根据特定规则从jQuery填充。如果它未填充,则我知道视图上存在无效内容。

谢谢。

4个回答

29

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

自1.9.0版本开始,这是默认行为。您可以通过添加以下内容来手动修复:

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

正如你可以在这里看到的那样。

另一个变化应该使得带有隐藏元素的表单的设置更加容易,现在这些元素默认被忽略了(选项“ignore”现在默认为“:hidden”)。理论上,这可能会破坏现有的设置。如果出现这种情况,您可以通过将ignore-option设置为“[]”(方括号而不是引号)来修复它。


@JustinMichaels,也许自从我写这个答案以来有些变化。当时我检查了jquery.validate.unobtrusive.js文件并发现了ignore设置。 - Chuck Norris
2
太好了,我已经找了3个小时了,这是一个非常好的答案... “谢谢你,查克·诺里斯!”(来自与文斯·沃恩主演的电影《躲避球》) - user1477388
嘿,等等,你太年轻了,不可能是查克·诺里斯! - MetaGuru
查克·诺里斯不知道什么是年龄...他永远活着。 - Chuck Norris
4
记住不要把 $.validator.setDefaults({ ignore: [] }); 放在 $(document).ready 中,因为这样会太晚。如果你不能这样做,请使用:$('form').validate().settings.ignore = [] - Luke
显示剩余2条评论

0
您还可以在jquery.validate.js文件中注释掉此行代码。 ignore:“:hidden”

重复答案给查克·诺里斯。 - Matt Bodily

0
如果您不需要在控制器中使用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);
}

-1
你总是可以把 @Html.HiddenFor(m => m.CompanyCityID) 放在一个隐藏的 div 中,然后将它改成 EditorFor()CSS
.hidden {
    display: none;
}​

视图

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

2
这似乎不起作用。我认为它仍然可以识别出它是隐藏的,即使它是一个隐藏的父元素。 - Mike Cole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接