9

我正在使用jQuery驗證插件,v1.11.0.2/4/2013與jquery.validate.unobtrusive.js。數字範圍驗證在jquery.validate.unobtrusive.js中無法正常工作

我想我的臉對於數字域範圍驗證的錯誤:驗證字符串值與最小值和最大值的字符串的字符串進行比較,而不是與最小數和最大數比較場數。

攝製步驟:

您集驗證範圍1-1000,使用以下HTML:

<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」之後,而不是在它們之間,所以失敗。

問題:這個bug是否已知?什麼是最好的解決方法?

回答

7

我也看到了這個問題。我剛剛通過手動更新我的代碼證實了它在JQuery驗證1.11.1更新中得到了修復。該更新尚未發佈在NuGET存儲庫上。

你可以從這裏下載更新: http://bassistance.de/jquery-plugins/jquery-plugin-validation/

微軟CDN地址是:從4月3日

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


更新:

的NuGet包更新現在可用。如果你通過NuGET更新到JQuery Validation 1.11.1,你將會修復這個問題。

+0

感謝您的信息。你真的測試過它嗎?因爲我看到了其他線程,人們說這個在前一版本中已經修復,但事實並非如此。 當NuGet更新時,還有任何信息嗎? – 2013-04-03 06:53:05

+0

嗨。是的,我真的在我的應用程序上測試過它。我進行了大量的範圍驗證,並且所有這些都被破壞了。我只是用新版本(複製和粘貼)替換JS文件內容(最初由NuGET安裝),現在我的所有頁面都在運行。 NuGET包現在已經發布。 – Iravanchi 2013-04-03 23:23:44

+0

我剛剛爲我的項目更新了NuGet管理器中的JQuery驗證,現在範圍驗證正常工作。 – 2013-04-08 19:34:54

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

我有完全相同的問題。上述解決方法的工作,但在for/next循環中有一個小錯誤。將第9行替換爲:「for(var ri = rule.range.length - 1; ri> = 0; ri--){」。我已更新,但更改必須經同行審覈批准。 – Pando 2013-03-27 00:07:17

+0

你能解釋爲什麼你建議以相反的順序枚舉? – 2013-03-27 01:07:22

+0

爲了獲得更好的性能,您不希望在每次迭代中評估數組的長度。有幾種不同的方法可以做到這一點。檢查http://www.openjs.com/articles/for_loop.php – Pando 2013-04-05 00:07:08

0

其中一個解決辦法將是重寫jquery的驗證程序的範圍的方法,如下:

$.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類型在使用Number(value), Number(param[0]) and Number(param[1])適當比較的value, param[0] and param[1]到數字類型值號之間,而不是字符串之間發生。