禁用JavaScript所需的验证

Disable required validation by JavaScript

本文关键字:验证 JavaScript 禁用      更新时间:2023-09-26

我有一个创建表单来创建一个对象。create模型具有一些仅可见的属性。hide, .show()),如果复选框被选中并且被标记为必需(通过Model中的Attribute)。

不幸的是,当未选中复选框时,将对隐藏的属性执行所需的验证。

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

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

有主意吗?

提前感谢托拜厄斯

更新:

下面是java脚本代码。data-val属性被正确设置为false。似乎验证并不关心这个属性。还有data- value -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();
                        }
                    })
            });

我用自定义验证属性处理过类似的情况。你可以使用RequiredIf属性,而不是为属性使用Required属性,并且只有当另一个属性是某个值时,你的一些属性才需要。

这是一个关于创建这样一个属性的帖子(在页面中间的"一个更复杂的自定义验证器"部分的例子):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');

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

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

同样,你可以使用类名,如

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

如果你想删除特定的规则,这样做

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

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

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

不引人注目的验证查找此属性data-val="true"

我猜,如果你做一个$('#mycheckbox').data('val','false'),验证将跳过一个项目与该id。

可能有更合适的方法,但如果没有,就用这个。

欢呼。

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

    最近发现你可以用提交按钮来做。点击此链接查看信息
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" />
  • 另一种更灵活但更复杂的方法:您可以通过将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'));
    },
    

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

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

    您可以实现像"RequiredIf"这样的自定义验证器。

    这将使您的模型设计相当明显(不像建议的仅客户端解决方案)。这允许您将验证逻辑与显示逻辑分开(这就是MVC的全部内容)。

    请看答案:RequiredIf条件验证属性

    和最后那篇博文:ASP中的条件验证。. NET MVC 3

    干杯!