Asp.net mvc 4 动态更改jQuery非干扰性验证属性
我有一个内置ASP.NET MVC 4的页面,它使用jquery.validate.unobtrusive库进行客户端验证。有一个输入需要在一个数字范围内。但是,此范围可以根据用户与表单其他部分的交互动态更改 默认值验证很好,但是在更新Asp.net mvc 4 动态更改jQuery非干扰性验证属性,asp.net-mvc-4,jquery-validate,unobtrusive-validation,Asp.net Mvc 4,Jquery Validate,Unobtrusive Validation,我有一个内置ASP.NET MVC 4的页面,它使用jquery.validate.unobtrusive库进行客户端验证。有一个输入需要在一个数字范围内。但是,此范围可以根据用户与表单其他部分的交互动态更改 默认值验证很好,但是在更新数据规则范围属性后,验证和消息仍会在原始值上触发 以下是初始页面加载时的输入: <input id="amount" data-rule-range="[1,350]" data-msg-range="Please enter an amount betwe
数据规则范围
属性后,验证和消息仍会在原始值上触发
以下是初始页面加载时的输入:
<input id="amount" data-rule-range="[1,350]" data-msg-range="Please enter an amount between ${0} and ${1}">
此时,如果在输入中输入500,则验证将失败,并显示前面相同的消息,说明它必须介于$1和$350之间。我还尝试从表单中删除验证器和不引人注目的验证,并再次解析它,但没有成功
$('form').removeData('validator');
$("form").removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse("form");
是否有一种干净的方法可以根据输入属性动态更改验证行为?您不能通过更改数据属性来动态更改规则。这是因为jQuery验证插件是使用页面加载上现有的
属性初始化的。。。在对属性进行动态更改后,插件无法自动重新初始化
必须使用开发人员提供的.rules('add')
和.rules('remove')
方法
请参阅:正如Sparky指出的那样,在验证插件初始化后,动态更改默认属性将不会被选中。为了更好地解决这一问题,而不必重新调整注册已验证字段和规则的方式,我发现在不显眼的库中注册自定义适配器最简单:
jQuery.validator.unobtrusive.adapters.add("amount", {}, function (options) {
options.rules["amount"] = true;
options.messages["amount"] = function () { return $(options.element).attr('data-val-amount'); };
});
jQuery.validator.addMethod("amount", function (val, el, params) {
try {
var max = $(el).attr('data-amount-max');
var min = $(el).attr('data-amount-min');
return val <= max && val >= min;
} catch (e) {
console.log("Attribute data-amount-max or data-amount-min missing from input");
return false;
}
});
你可以试试这个:
// reset the form's validator
$("form").removeData("validator");
// change the range
$("#amount").attr("data-rule-range", "[1,600]");
// reapply the form's validator
$.validator.unobtrusive.parse(document);
charle的解决方案有效!但是,您不能使用模型属性,我构建的输入如下:
@Html.TextBoxFor(m => Model.EnterValue, new
{
@class = "form-control",
id="xxxx"
data_val = "true",
data_val_range = String.Format(Messages.ValueTooBig, Model.ParamName),
data_val_range_max = 6,
data_val_range_min = 2,
data_val_regex_pattern = "^\\d+(,\\d{1,2})?$"
})
然后在javascript中:
$("form").removeData("validator");
$("#xxxx").attr('data-val-range-max', 3)
$("#xxxx").attr('data-val-range-min', 0)
$.validator.unobtrusive.parse(document);
这就是我担心的。我没有通过脚本而不是属性重新连接验证以使用注册规则,而是通过不引人注目的库注册新的自定义适配器来解决问题(请参阅我的答案)。谢谢你的确认!伙计,我知道这已经两年了,但谢谢。把我的头撞在墙上,想把这件事做好。停下来。我通过ajax调用一些密集的服务器端验证来获得验证消息。无法以任何其他方式更改消息。仅供参考,此操作有效,但验证消息从未更新。更正:此操作不正常(例如,错误消息未更新)。最好通过适当的rules()
方法。
@Html.TextBoxFor(m => Model.EnterValue, new
{
@class = "form-control",
id="xxxx"
data_val = "true",
data_val_range = String.Format(Messages.ValueTooBig, Model.ParamName),
data_val_range_max = 6,
data_val_range_min = 2,
data_val_regex_pattern = "^\\d+(,\\d{1,2})?$"
})
$("form").removeData("validator");
$("#xxxx").attr('data-val-range-max', 3)
$("#xxxx").attr('data-val-range-min', 0)
$.validator.unobtrusive.parse(document);