我有一个创建表单来创建一个对象。 创建模型有一些只有可见的属性(.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();
}
})
});
答案 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 ......
//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'));
},
您不需要重置所有消息,输入样式和验证摘要以便能够提交表单,但如果您想在页面加载后更改验证,则它非常有用。否则,即使您更改了验证,之前的错误消息仍然可见......
答案 5 :(得分:-1)
默认DataAnnotationsModelValidatorProvider
为所有值类型添加Required属性。您可以通过在this answer中添加代码来更改此行为。
答案 6 :(得分:-1)
您可以实现类似“RequiredIf”的自定义验证程序。
这将使您的模型设计非常明显(不同于仅提供客户端的解决方案)。这允许您将验证逻辑与显示逻辑分开(这就是MVC的全部内容)。
请参阅此答案:RequiredIf Conditional Validation Attribute
并最终发布了博文:Conditional Validation in ASP.NET MVC 3
喝彩!