【问题标题】:Disable required validation by JavaScript禁用 JavaScript 所需的验证
【发布时间】:2011-11-15 10:07:13
【问题描述】:

我有一个创建表单来创建一个对象。 创建模型的某些属性只有在选中复选框并且标记为必需(由模型中的属性)时才可见(.hide、.show())。

不幸的是,如果未选中该复选框,则会对隐藏的属性执行所需的验证。

如何禁用此属性所需的验证?

我尝试将输入元素的 data-val 属性设置为 false,但这不起作用。

有什么想法吗?

提前致谢 托比亚斯

更新:

这里是java脚本代码。 data-val 属性正确设置为 false。似乎验证不关心这个属性。还有 data-val-required 属性,但有一个文本我无法备份。

$(function () {
                $("#MyCheckbox")
                    .change(function () {
                        if (this.checked) {
                            $("#divWithChildProperties [data-val]").attr("data-val", true);
                            $("#divWithChildProperties ").show();
                        }
                        else {
                            $("#divWithChildProperties [data-val]").attr("data-val", false);
                            $("#divWithChildProperties ").hide();
                        }
                    })
            });

【问题讨论】:

    标签: javascript asp.net-mvc-3 validation unobtrusive-javascript


    【解决方案1】:

    我已经使用自定义验证属性处理过此类案例。除了对属性使用Required 属性外,您还可以创建RequiredIf 属性,并且仅当另一个属性为特定值时才使您的某些属性成为必需。

    这是一篇关于创建这样的属性的帖子(页面中间“更复杂的自定义验证器”部分下的示例):http://www.devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp.net-mvc-3-part-2

    如果您的复选框代表模型中的一个属性,这应该可以正常工作。

    如果您不想使用新的验证属性来处理这个问题,您将不得不做更多的事情,而不仅仅是将 data-val 属性更改为 false。当 jQuery validate 第一次解析您的表单时,它会将值存储在表单的数据中。所以仅仅改变 data-val 是不够的。您还必须删除存储的验证数据并重新解析表单。这是一个例子:

    // Do this after you've removed/modified the data-val attribute
    $('selector for your form').removeData('unobtrusiveValidation');
    $('selector for your form').removeData('validator');
    $.validator.unobtrusive.parse('selector for your form');
    

    【讨论】:

    • 大声笑,我想做的只是将搜索字段添加到索引页面。谢谢
    【解决方案2】:

    您可以使用以下 JQuery 删除元素的所有验证规则

    $('#ElementId').rules('remove');
    

    同样的方式你可以使用类名,比如,

    $('.ElementClassName').rules('remove');
    

    如果您想删除特定规则,请这样做

    $('#ElementId').rules('remove', 'required');
    

    【讨论】:

      【解决方案3】:

      MVC 提供的不显眼的 javascript 插件不会即时处理数据属性。相反,它会解析文档准备好的结果并缓存它们。

      在修改相关属性后尝试在您的表单上调用$.validator.unobtrusive.parse(myForm),看看它是否能给您带来预期的结果。

      【讨论】:

        【解决方案4】:

        不显眼的验证会查找此属性data-val="true"

        我猜,如果您执行$('#mycheckbox').data('val','false'),验证将跳过具有该 ID 的项目。

        可能有更合适的方法来做,但如果没有,就拿这个吧。

        干杯。

        【讨论】:

        • 复选框显示或隐藏输入字段。正如我所写,我已经尝试将所有输入字段的 data-val 属性设置为 false。
        【解决方案5】:

        有很多方法可以在 Javascript 中禁用不显眼的验证,但其中大多数似乎有点 hackish...

        1. 最近发现可以通过提交按钮来完成。检查此链接以获取信息

        http://www.nitrix-reloaded.com/2013/09/16/disable-client-side-validation-on-a-button-click-asp-net-mvc/

        //this
        <script type="text/javascript">
          document.getElementById("backButton").disableValidation = true;
        </script>
        //or this
        <input type="submit" name="backButton" value="Back" 
         title="Go back to Prev Step" disableValidation="true" />
        //or this
        <input type="submit" name="backButton" value="Back"
         title="Go back to Prev Step" class="mybtn-style cancel" />
        
        1. 另一种更灵活但更复杂的方法:您可以通过将data-val 属性设置为false 来禁用不显眼的验证。但是有个窍门……

        当文档准备好时,不显眼的验证数据会被缓存。这意味着,如果您在开头有 data-val='true' 并且稍后更改它,它仍然是 true

        因此,如果您想在文档准备好后更改它,您还需要重置验证器,该验证器将清除缓存的数据。这是怎么做的:

        disableValidation: function () {
            //Set the attribute to false
            $("[data-val='true']").attr('data-val', 'false');
        
            //Reset validation message
            $('.field-validation-error')
            .removeClass('field-validation-error')
            .addClass('field-validation-valid');
        
            //Reset input, select and textarea style
            $('.input-validation-error')
            .removeClass('input-validation-error')
            .addClass('valid');
        
            //Reset validation summary
            $(".validation-summary-errors")
            .removeClass("validation-summary-errors")
            .addClass("validation-summary-valid");
        
            //To reenable lazy validation (no validation until you submit the form)
            $('form').removeData('unobtrusiveValidation');
            $('form').removeData('validator');
            $.validator.unobtrusive.parse($('form'));
        },
        

        您无需重置所有消息、输入样式和验证摘要即可提交表单,但如果您想在页面加载后更改验证,这很有用。否则,即使你更改了验证,之前的错误信息仍然可见...

        【讨论】:

        • 第一个选项在 MVC4 中似乎对我不起作用。
        【解决方案6】:

        默认的DataAnnotationsModelValidatorProvider 为所有值类型添加了一个Required 属性。您可以通过在this answer 中添加代码来更改此行为。

        【讨论】:

          【解决方案7】:

          您可以实现自定义验证器,例如“RequiredIf”。

          这将使您的模型设计非常明显(与建议的仅客户端解决方案不同)。这允许您将验证逻辑与显示逻辑分开(这就是 MVC 的全部意义所在)。

          看到这个答案:RequiredIf Conditional Validation Attribute

          最后是那篇博文:Conditional Validation in ASP.NET MVC 3

          干杯!

          【讨论】:

            猜你喜欢
            • 2017-04-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-19
            • 2018-01-13
            • 2018-06-02
            • 1970-01-01
            • 2010-09-28
            相关资源
            最近更新 更多