提问人:Philipp Munin 提问时间:3/25/2013 更新时间:7/25/2016 访问量:7293
数值范围验证在 jquery.validate.unobtrusive.js 中无法正常工作
Numeric Range validation does not work properly in jquery.validate.unobtrusive.js
问:
我正在使用jQuery验证插件,v1.11.0,2/4/2013和jquery.validate.unobtrusive.js。
我想我遇到了数值字段范围验证的错误:验证将字符串值与最小值的字符串和最大值的字符串进行比较,而不是将字段数与最小值和最大值进行比较。
重现步骤:
使用以下 HTML 设置验证范围 1-1000:
<input name="Data.MaxConcurrentInstances" class="text-box single-line" id="Data_MaxConcurrentInstances" type="number" value="" data-val-number="The field Max concurrent instances must be a number." data-val="true" data-val-range-min="1" data-val-range-max="1000" data-val-range="The field Max concurrent instances must be between 1 and 1000.">
设置测试字段值:7。
预期结果:验证成功。没有错误。
实际结果:验证失败。内部原因:它失败,因为按字母顺序排列的字符串“7”在字符串“1”和“1000”之后,而不是在它们之间。
问题:这个错误是已知的吗?最好的解决方法是什么?
答:
到目前为止,我发现的最佳解决方法是运行修补启动脚本:
$(document).ready(function() {
window.setTimeout(function () {
//Fixing jquery Unobtrusive validation range integer bug
var allRules = $.data(document.forms[0], "validator").settings.rules;
for (var ruleName in allRules) {
var rule = allRules[ruleName];
if (rule.range != undefined && rule.number)
for (var ri = rule.range.length-1; ri >=0 ; ri--) {
rule.range[ri] = Number(rule.range[ri]);
}
}
}, 100);
});
评论
我也看到了这个问题。我刚刚通过手动更新我的代码确认它在 JQuery Validation 1.11.1 更新中已修复。此更新尚未在 NuGET 存储库上发布。
您可以从以下位置下载更新:http://bassistance.de/jquery-plugins/jquery-plugin-validation/
Microsoft CDN 地址为:
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.js
http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js
4月3日更新:
NuGET 包更新现已推出。如果通过 NuGET 更新到 JQuery Validation 1.11.1,则该问题将得到解决。
评论
解决方法之一是覆盖jquery验证器的范围方法,如下所示:
$.validator.methods.range = function (value, element, param) {
return this.optional(element) || (Number(value) >= Number(param[0]) && Number(value) <= Number(param[1]));
}
验证器插件中 range 的实际代码是
range : function (value, element, param) {
return this.optional(element) || (value >= param[0] && value <= param[1]);
}
在将 String 类型值转换为 Number 类型时,使用 Number 而不是 String 之间进行适当的比较。value, param[0] and param[1]
Number(value), Number(param[0]) and Number(param[1])
评论