禁用 JavaScript 所需的验证

Disable required validation by JavaScript

提问人:Tobias 提问时间:9/12/2011 最后编辑:David MurdochTobias 更新时间:1/23/2018 访问量:45563

问:

我有一个创建表单来创建一个对象。 创建模型具有一些属性,这些属性仅在选中复选框时可见(.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();
                        }
                    })
            });
asp.net-mvc-3 验证 不显眼的 javascript

评论


答:

0赞 vtortola 9/12/2011 #1

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

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

可能有更合适的方法可以做到这一点,但如果没有,请采取这个。

干杯。

评论

0赞 Tobias 9/12/2011
该复选框显示或隐藏输入字段。正如我所写的,我已经尝试将所有输入字段的 data-val 属性设置为 false。
-1赞 counsellorben 9/13/2011 #2

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

25赞 bbak 9/13/2011 #3

我使用自定义验证属性处理过这样的情况。您可以创建一个 RequiredIf 特性,并仅在另一个属性是特定值时才使某些属性成为必需属性,而不是对属性使用 Required 特性。

这是一篇关于创建此类属性的帖子(页面中间“更复杂的自定义验证器”部分下的示例): 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赞 Mike_Matthews_II 4/25/2015
哈哈,我想做的就是将搜索字段添加到索引页面。谢谢
2赞 DMac the Destroyer 9/13/2011 #4

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

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

-1赞 fredlegrain 9/13/2011 #5

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

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

请参阅此答案:RequiredIf 条件验证属性

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

干杯!

0赞 Gudradain 11/11/2014 #6

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

  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-valfalse

当文档准备就绪时,将缓存不显眼的验证数据。这意味着,如果您在开始时有并且稍后更改它,它仍然是 .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'));
},

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

评论

0赞 Tridus 7/8/2015
第一个选项在 MVC4 中似乎对我不起作用。
7赞 Karthikeyan P 8/27/2015 #7

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

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

同样,你可以像这样使用类名

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

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

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