11

我正在使用带有 jquery.validate.unobtrusive.js 的 jQuery 验证插件 v1.11.0,2/4/2013。

我想我面临数字字段范围验证的错误:验证将字符串值与最小值字符串和最大值字符串进行比较,而不是将字段数与 min-number 和 max-number 进行比较。

复制步骤:

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

问题:已知此错误吗?最好的解决方法是什么?

4

3 回答 3

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,您将解决该问题。

于 2013-04-02T04:53:09.170 回答
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);
});
于 2013-03-25T07:28:32.043 回答
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 之间。

于 2015-06-06T14:53:28.403 回答