让 MVC 4 验证 jquery 手风琴表单的所有部分

Posted

技术标签:

【中文标题】让 MVC 4 验证 jquery 手风琴表单的所有部分【英文标题】:Getting MVC 4 to validate all sections of jquery accordion form 【发布时间】:2014-12-01 03:01:11 【问题描述】:

我有一个很大的表格,我使用 jQuery-UI 的 Accordion 插件将它分成几个部分。

当我单击表单的提交按钮时,MVC 的服务器端验证不会检查表单的所有输入字段 - 它验证当前展开部分的字段。

在这个例子中,当我点击提交时,MVC 只验证A 部分。如果B 或C 部分还没有填写,它会抛出一个疯狂的NullReferenceException 错误。我希望 MVC 4 验证 Accordion 中的所有字段,而不是只查看一个。

查看呈现的 html,包含我要验证的其他字段的 <div class="ui-accordion-content"> 元素具有 style="display:none"。除了显示的字段之外,我希望 MVC 4 验证未显示的字段。

编辑: Stack Overflow 上有 many answers 建议将 ignore: [] 添加到 jQuery 验证器设置应该可以工作。它对我不起作用,并且无论如何都会提交表单。

$("#GeneralForm").validate(
    rules: 
        GuestName: 
            required: true,
        ,
        GuestID: 
            required: true,
        , // etc.
    ,
    ignore: []
);

【问题讨论】:

【参考方案1】:

jquery 验证器默认忽略隐藏元素,但您可以禁用此行为:

<script type="text/javascript">
    $.validator.setDefaults(
        ignore: ""
    )
</script>

【讨论】:

看起来这是真的(尽管我已经读过应该使用ignore:[] 而不是ignore:""),但我编辑了我的问题以反映这不适用于我的情况。 @alex 你可以尝试编辑 jquery.validate.unobstrusive.js 文件。有一个带有选项的 validationInfo 方法,您可以在其中添加忽略属性。【参考方案2】:

解决方案最终变得非常简单。我有两个脚本:一个是 Accordion 实例化的地方,另一个是验证发生的地方:

@Scripts.Render("~/Scripts/Validation", "~/Scripts/Accordion")

顺序很重要;切换这两个解决了问题。

颠倒顺序会:

抛出 0 个控制台错误 让 MVC 非常懒惰地验证表单;即使 jQuery-validate 知道某些输入无效,它也不会阻止表单发布 如果您使用的是 Entity Framework 5(特别是在 db.SaveChanges() 上),稍后会抛出运行时 NullReferenceException 错误。

此外,validator 需要一个自定义的submitHandler(它将根据它们包含的表单字段是否有效打开面板;只有在两个区域都通过验证测试时才发布表单) onsubmit: false。默认为true。如果是真的,并且您正在使用自定义 submitHandler,everything silently implodes。

【讨论】:

以上是关于让 MVC 4 验证 jquery 手风琴表单的所有部分的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 进行 MVC 手动表单验证始终返回 True

使用 jQuery 1.10.2 在 MVC 4 中进行客户端验证

在 asp.net mvc razor 页面中验证 jquery 中的特定表单字段

MVC jquery表单验证 和 jquery_Validate表单验证

必填字段验证在 JQuery Popup MVC 4 中不起作用

必填字段验证在 JQuery Popup MVC 4 中不起作用