提问人:Tobias 提问时间:9/12/2011 最后编辑:David MurdochTobias 更新时间:1/23/2018 访问量:45563
禁用 JavaScript 所需的验证
Disable required validation by JavaScript
问:
我有一个创建表单来创建一个对象。 创建模型具有一些属性,这些属性仅在选中复选框时可见(.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();
}
})
});
答:
不显眼的验证会查找此属性data-val="true"
我猜,如果你做一个 ,验证将跳过具有该 ID 的项目。$('#mycheckbox').data('val','false')
可能有更合适的方法可以做到这一点,但如果没有,请采取这个。
干杯。
评论
默认值将 Required 属性添加到所有值类型。您可以通过在此答案中添加代码来更改此行为。DataAnnotationsModelValidatorProvider
我使用自定义验证属性处理过这样的情况。您可以创建一个 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');
评论
MVC 提供的不显眼的 javascript 插件不会动态处理数据属性。相反,它会在文档准备好时解析结果并缓存它们。
尝试在修改相关属性后调用您的表单,看看它是否能给您带来预期的结果。$.validator.unobtrusive.parse(myForm)
您可以实现自定义验证器,例如“RequiredIf”。
这将使您的模型设计非常明显(与建议的仅客户端解决方案不同)。这允许您将验证逻辑与显示逻辑分开(这就是 MVC 的全部内容)。
请参阅此答案:RequiredIf 条件验证属性
最终那篇博文:MVC 3 中的条件验证 ASP.NET
干杯!
有很多方法可以在 Javascript 中禁用不显眼的验证,但其中大多数似乎有点黑客......
- 最近发现你可以用提交按钮来做。查看此链接以获取信息
//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'));
},
您无需重置所有消息、输入样式和验证摘要即可提交表单,但如果您想在页面加载后更改验证,这将非常有用。否则,即使您更改了验证,以前的错误消息仍然可见...
评论
您可以使用以下 JQuery 删除元素的所有验证规则
$('#ElementId').rules('remove');
同样,你可以像这样使用类名,
$('.ElementClassName').rules('remove');
如果要删除特定规则,请这样做
$('#ElementId').rules('remove', 'required');
评论