我正在使用jQuery Validation Plugin,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”之后,而不是在它们之间。
问题:这个错误是否已知?最好的解决方法是什么?
答案 0 :(得分:8)
我也看到了这个问题。我刚刚确认通过手动更新我的代码在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,您将解决问题。
答案 1 :(得分:1)
到目前为止,我发现最好的解决方法是运行修补启动脚本:
$(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);
});
答案 2 :(得分:1)
其中一种解决方法是覆盖jquery验证器的range方法,如下所示:
$.validator.methods.range = function (value, element, param) {
return this.optional(element) || (Number(value) >= Number(param[0]) && Number(value) <= Number(param[1]));
}
验证器插件中范围的实际代码是
range : function (value, element, param) {
return this.optional(element) || (value >= param[0] && value <= param[1]);
}
使用value, param[0] and param[1]
将Number(value), Number(param[0]) and Number(param[1])
中的String类型值转换为Number类型时,在Number之间进行正确的比较,而不是在String之间进行比较。