禁用JavaScript所需的验证

时间:2011-09-12 14:43:13

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

我有一个创建表单来创建一个对象。 创建模型有一些只有可见的属性(.hide,.show())如果选中了复选框并且标记为必需(按模型中的属性)。

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

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

我尝试将input元素的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();
                        }
                    })
            });

7 个答案:

答案 0 :(得分:22)

我使用自定义验证属性处理了这样的情况。您可以创建一个RequiredIf属性,只有当另一个属性是特定值时才需要使用某些属性,而不是使用属性的必需属性。

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

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

如果您不想使用新的验证属性来处理此问题,则除了将data-val属性更改为false之外,您还需要做更多的事情。当jQuery验证首先解析您的表单时,它会将值存储在表单的数据中。所以简单地改变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');

答案 1 :(得分:6)

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

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

您也可以使用类名

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

如果您要删除特定规则,请执行以下操作

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

答案 2 :(得分:1)

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

在修改相关媒体后,尝试在表单上调用$.validator.unobtrusive.parse(myForm),看看它是否能为您提供预期效果。

答案 3 :(得分:0)

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

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

可能有一种更合适的方法可以做到,但如果没有,就拿这个。

欢呼声。

答案 4 :(得分:0)

有许多方法可以在Javascript中禁用不显眼的验证,但大多数方法看起来有点像hackish ......

  1. 最近发现你可以用提交按钮来做。查看此链接以获取信息
  2. 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来禁用不显眼的验证。但是有一招......
    2. 文档准备就绪时,缓存不显眼的验证数据。这意味着如果您在开头有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'));
      },
      

      您不需要重置所有消息,输入样式和验证摘要以便能够提交表单,但如果您想在页面加载后更改验证,则它非常有用。否则,即使您更改了验证,之前的错误消息仍然可见......

答案 5 :(得分:-1)

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

答案 6 :(得分:-1)

您可以实现类似“RequiredIf”的自定义验证程序。

这将使您的模型设计非常明显(不同于仅提供客户端的解决方案)。这允许您将验证逻辑与显示逻辑分开(这就是MVC的全部内容)。

请参阅此答案:RequiredIf Conditional Validation Attribute

并最终发布了博文:Conditional Validation in ASP.NET MVC 3

喝彩!