【问题标题】:Getting MVC 4 to validate all sections of jquery accordion form让 MVC 4 验证 jquery 手风琴表单的所有部分
【发布时间】: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: []
});

【问题讨论】:

    标签: jquery asp.net-mvc jquery-ui asp.net-mvc-4 validation


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-30
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多