11

jquery.validate.unobtrusive.jsでjQueryValidationPlugin、v1.11.0、2/4/2013を使用しています。

数値フィールドの範囲検証のバグに直面していると思います。検証では、フィールドの数を最小数および最大数と比較するのではなく、文字列値を最小の文字列および最大の文字列と比較します。

再現ステップ:

次の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

この問題も見られます。コードを手動で更新することにより、JQueryValidation1.11.1アップデートで修正されていることを確認しました。更新は、NuGETリポジトリでまだ公開されていません。

ここからアップデートをダウンロードできます:http: //bassistance.de/jquery-plugins/jquery-plugin-validation/

MicrosoftCDNアドレスは次のとおりです。

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を介してJQueryValidation1.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

回避策の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])間ではなく数値間で発生します。

于 2015-06-06T14:53:28.403 に答える