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


我正在使用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。

预期成绩


11024
2018-03-25 07:26


起源



答案:


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


8
2018-04-02 04:53



谢谢你的信息。你真的测试过吗?因为我看到了其他线程,人们说这个版本在之前的版本中已经修复了,但事实并非如此。当NuGet更新时,还有什么信息吗? - Philipp Munin
你好。是的,我实际上在我的应用程序上测试了它。我进行了大量的范围验证,所有这些都被破坏了。我只是用新版本(复制和粘贴)替换JS文件内容(最初由NuGET安装),现在我的所有页面都在运行。 NuGET包已经发布了。 - Iravanchi
我刚刚在NuGet管理器中为我的项目更新了JQuery验证,现在Range验证工作正常。 - Philipp Munin


答案:


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


8
2018-04-02 04:53



谢谢你的信息。你真的测试过吗?因为我看到了其他线程,人们说这个版本在之前的版本中已经修复了,但事实并非如此。当NuGet更新时,还有什么信息吗? - Philipp Munin
你好。是的,我实际上在我的应用程序上测试了它。我进行了大量的范围验证,所有这些都被破坏了。我只是用新版本(复制和粘贴)替换JS文件内容(最初由NuGET安装),现在我的所有页面都在运行。 NuGET包已经发布了。 - Iravanchi
我刚刚在NuGet管理器中为我的项目更新了JQuery验证,现在Range验证工作正常。 - Philipp Munin


到目前为止,我发现最好的解决方法是运行修补启动脚本:

$(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);
});

1
2018-03-25 07:28



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


其中一个解决方法是覆盖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]);
        }

在转换中的String类型值 value, param[0] and param[1] 到数字类型使用 Number(value), Number(param[0]) and Number(param[1]) 在Number之间进行适当的比较,而不是在String之间进行。


1
2018-06-06 14:53