【问题标题】:jQuery disable rule validation on a single fieldjQuery 在单个字段上禁用规则验证
【发布时间】:2023-03-11 02:07:01
【问题描述】:

我正在使用 MVC 创建在运行时生成的表单。对于验证,我正在尝试使用非常方便的 jQuery 验证库。我在标签的 cdata 属性中有每个字段的验证表达式

<input type="text" name="xyz" id="xyz" class="defaultTextBox"
  cdata="{validate:{required:true, decimal:true, messages:
          {required:'Please enter an decimal value', 
           decimal:'Please enter a valid decimal'}}}">

这很好用。现在我还有一个要求是根据页面上的逻辑显示和隐藏某些字段,我需要禁用对隐藏字段的验证,以便它们不会干扰表单提交。只需将 required:true 切换为 false 并返回 true 就足够了。只有我不知道怎么做。

有人有这方面的经验吗?

【问题讨论】:

    标签: validation jquery-validate


    【解决方案1】:

    只需添加忽略规则并定义选择器。 在此示例中,验证将忽略所有具有 class="ignore" 的元素

    $("#myform").validate({
       ignore: ".ignore"
    })
    

    【讨论】:

    • 警告! jquery.validate.jsdefaults 配置中的默认值是ignore: ":hidden" 所以我建议放置ignore: ".ignore, :hidden" 否则不用于突然验证的隐藏字段会给你错误
    • 没关系,我是在 jquery.validate.js 之前执行的
    【解决方案2】:

    如果您使用 ASP.NET MVC Unobtrusive JQuery 验证,您需要以这种方式设置设置。这是因为微软实际上调用 jQuery validate 的方式。这在ready 方法中应该是安全的。

    编辑:请在复制粘贴之前查看下面的 Cory 评论。这是我的原始代码

        $("form").data("validator").settings.ignore = ".data-val-ignore, :hidden, :disabled";
    

    然后我只需将.data-val-ignore 类应用于不验证的事物。

    请注意,您可能需要添加:hidden,这实际上是jquery.validate.js 中定义的默认忽略行为。我也喜欢加:disabled

    $.extend($.validator, {
    defaults: {
        messages: {},
        groups: {},
        rules: {},
        errorClass: "error",
        validClass: "valid",
        errorElement: "label",
        focusInvalid: true,
        errorContainer: $([]),
        errorLabelContainer: $([]),
        onsubmit: true,
        ignore: ":hidden",              // default for ignore in jquery.validate.js
        ignoreTitle: false,
        onfocusin: function( element, event ) {
            this.lastActive = element;
    

    最后,您可能想要设置样式 - 在调试期间特别有用。

    .data-val-ignore
    {
        background: #eee;
    }
    

    【讨论】:

    • 感谢 MVC 示例;正是我想要的。
    • 访问设置的方式似乎已经改变(至少在我的项目中),现在是: $("form").validate().settings.ignore - 以防万一其他人的解决方案!
    • @CoryW。我真的认为你应该把这个评论变成一个答案!节省了我很多时间。没有其他解决方案对我有用
    【解决方案3】:

    根据 Gabe 的回答,您还可以将忽略值设置为默认值,因此您不必在每个表单上都设置它。

    $.validator.setDefaults({ignore: ".ignore"});
    

    另外请注意,忽略字段是一个 jQuery 选择器,用于 jQuery not() 函数,因此可以使用任何有效的选择器,而不仅仅是简单的类。

    有关可以设置的其他默认值的详细信息,另请参阅http://docs.jquery.com/Plugins/Validation/validate#toptions

    【讨论】:

      【解决方案4】:

      我和$('.multiselect').rules('remove');度过了一段美好的时光

      在我的情况下,无论出于何种原因添加 .cancel.data-val-ignore $.validator.setDefaults$('.multiselect') 都没有修复它。

      我也试过了

      $('select[multiple][data-val]').removeAttr('data-val').removeAttr('data-val-number').addClass('data-val-ignore').validate({ ignore: "[multiple]" });
      $.validator.setDefaults({ ignore: ":hidden,:disabled,.data-val-ignore" });
      $('.multiselect').closest('form').data('validator').settings.ignore = ":hidden,:disabled,.data-val-ignore, .data-val-ignore *";
      $('.multiselect').data('validator').settings.ignore = "[multiselect]"
      

      其中的每一个......以及它们的组合

      我的jquery.validate.js

      /*! jQuery Validation Plugin - v1.11.0 - 2/4/2013
      * https://github.com/jzaefferer/jquery-validation
      * Copyright (c) 2013 Jörn Zaefferer; Licensed MIT */
      

      jquery 是

      jQuery JavaScript 库 v1.9.1 - 日期:2013-2-4

      【讨论】:

        【解决方案5】:

        您可以通过执行以下操作从单个字段中删除规则:

         $("#field").rules('remove', 'required');
        

        其中第二个参数是规则名称。我还删除了与此规则关联的属性以避免任何混淆:

         $("#field").removeAttr('required');     
        

        【讨论】:

          猜你喜欢
          • 2023-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-19
          相关资源
          最近更新 更多