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

Numeric Range validation does not work properly in jquery.validate.unobtrusive.js

提问人:Philipp Munin 提问时间:3/25/2013 更新时间:7/25/2016 访问量:7293

问:

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

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

jquery jquery-validate unobtrusive-javascript unobtrusive-validation

评论


答:

1赞 Philipp Munin 3/25/2013 #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);
});

评论

0赞 Pando 3/27/2013
我有完全相同的问题。上述解决方法有效,但在 for/next 循环中有一个小错误。将第 9 行替换为:“for (var ri = rule.range.length - 1;里 >= 0 ;ri--) {“.我更新了,但更改必须经过同行评审的批准。
0赞 Philipp Munin 3/27/2013
你能解释一下为什么你建议以相反的顺序枚举吗?
0赞 Pando 4/5/2013
为了获得更好的性能,您不希望在每次迭代中计算数组的长度。有几种不同的方法可以做到这一点。检查 openjs.com/articles/for_loop.php
8赞 Iravanchi 4/2/2013 #2

我也看到了这个问题。我刚刚通过手动更新我的代码确认它在 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,则该问题将得到解决。

评论

0赞 Philipp Munin 4/3/2013
谢谢你的信息。你真的测试过吗?因为我看到了其他线程,所以人们说这在以前的版本中已修复,但事实并非如此。另外,NuGet 何时更新是否有任何信息?
0赞 Iravanchi 4/4/2013
你好。是的,我实际上在我的应用程序上测试了它。我有很多范围验证,但都坏了。我只是将 JS 文件内容(最初由 NuGET 安装)替换为较新版本(复制和粘贴),我的所有页面现在都运行正常。NuGET 包现已发布。
0赞 Philipp Munin 4/9/2013
我刚刚在 NuGet 管理器中为我的项目更新了 JQuery 验证,现在范围验证工作正常。
1赞 user1477054 6/6/2015 #3

解决方法之一是覆盖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])