数字范围验证在jquery.validate.unobtrusive.js中无法正常工作

时间:2013-03-25 07:26:17

标签: jquery jquery-validate unobtrusive-javascript unobtrusive-validation

我正在使用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”之后,而不是在它们之间。

问题:这个错误是否已知?最好的解决方法是什么?

3 个答案:

答案 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之间进行比较。