2012-02-09 54 views
16

我嘗試使用jQuery全球化插件來修復jquery無阻礙客戶端驗證的逗號問題。不過,我嘗試了很多很多解決方案,但沒有解決這個問題的好方法。我在非英語的本地化計算機上,這對我的客戶輸入小數值(如「123,66」而非「123.66」)很重要。 ASP.NET驗證告訴我,價格必須是一個數字!呃?你是認真的嗎 ?大聲笑無法讓jQuery全球化工作

我得到這個JavaScript錯誤,當我嘗試修復。

$.global is undefined 

這裏我的代碼。

Layout.cshtml

<!DOCTYPE html> 
<html> 
<head> 
    <title>@ViewBag.Title</title> 
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> 

    <script src="@Url.Content("~/Scripts/jquery-1.7.1.js")" type="text/javascript"></script> 

    <script type="text/javascript" src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")"></script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"> </script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")"type="text/javascript"></script> 

    <script src="@Url.Content("~/Scripts/globalize.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/cultures/globalize.cultures.js")" type="text/javascript"></script> 

    <script src="@Url.Content("~/Scripts/jquery.form.js")"type="text/javascript"></script> 

    <script src="@Url.Content("~/Scripts/glob.fix.js")" type="text/javascript"></script> 
</head> 

<body> 
    @RenderBody() 
</body> 
</html> 

glob.fix.js

$.validator.methods.range = function (value, element, param) { 
    var globalizedValue = value.replace(",", "."); 
    return this.optional(element) || (globalizedValue >= param[0] && globalizedValue <= param[1]); 
} 

$.validator.methods.number = function (value, element) { 
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/.test(value); 
} 

我不明白..它應該工作,因爲我加入~/Scripts/globalize.js

有什麼想法?或者你可能有更好的解決方案讓客戶端驗證工作,並讓我輸入逗號作爲十進制值?

+0

謝謝你的範圍驗證代碼! – 2012-05-31 08:28:45

回答

21

我發現最終擺脫逗號分隔符的小數問題的方式!

這裏的結果圖片!沒有更多的驗證問題。

enter image description here

的步驟來修復。

1-獲取Globalization library for jQuery

你必須得到最新的腳本!我還發現一些已經過時的答案。
調用該庫的對象不再是$.global或類似的東西,而是Globalize

2-將腳本包含在您的項目中。你必須在jquery.validation之後添加它們。

<script src="@Url.Content("~/Scripts/globalize.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/cultures/globalize.cultures.js")" type="text/javascript"></script> 

3-替換驗證器的一些方法。這將覆蓋導致問題的'數字'和'範圍'驗證方法。

$.validator.methods.number = function (value, element) { 
    return this.optional(element) || !isNaN(Globalize.parseFloat(value)); 
} 

$.validator.methods.range = function (value, element, param) { 
    return this.optional(element) || (Globalize.parseFloat(value) >= param[0] && Globalize.parseFloat(value) <= param[1]); 
} 

Globalize.parseFloat =>這實際上將取代任何包含 '' 到 ''如果你選擇了需要它的文化。

在此之後..您必須添加。這將使全球化職能與文化協同工作。

$(document).ready(function() { 
     Globalize.culture('fr-CA'); 

     // Only there to show which culture are being used. 
     console.log(Globalize.culture().name); 
}); 

完整的代碼看起來像......

<!DOCTYPE html> 
<html> 
<head> 
    <title>@ViewBag.Title</title> 
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> 

    <script src="@Url.Content("~/Scripts/jquery-1.7.1.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"> </script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")"type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/globalize.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/cultures/globalize.cultures.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.form.js")"type="text/javascript"></script> 


<script type="text/javascript"> 

    $.validator.methods.number = function (value, element) { 
     return this.optional(element) || !isNaN(Globalize.parseFloat(value)); 
    } 
    $.validator.methods.range = function (value, element, param) { 
     return this.optional(element) || (Globalize.parseFloat(value) >= param[0] && Globalize.parseFloat(value) <= param[1]); 
    } 

    $(document).ready(function() { 
     Globalize.culture('fr-CA'); 

     // Only there to show which culture are being used. 
     console.log(Globalize.culture().name); 
    }); 
</script> 

</head> 

<body> 
    @RenderBody() 
</body> 
</html> 
+0

您可以將我們自己的答案標記爲已接受的答案。 Merci :-) – Ubikuity 2013-08-28 11:47:13

+0

謝謝。我做到了! :) – Rushino 2014-03-14 12:25:17

+0

位於github url中的Globalize.js文件在哪裏? – Levimatt 2015-10-05 09:17:16

2

好,解決了同樣的問題,我所做的:

$.validator.addMethod("price",function(value){ 
    return /^(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value); 
}); 

,然後用添加方法規則:

$("#form").validate({ 
    rules: { 
     price: "price" 
    } 
}); 

我「借用」從驗證插件本身驗證的正則表達式,並將點.和逗號,(千位分隔符X小數點分隔符)倒置。

+0

你把那個驗證(...)放在哪裏? – Rushino 2012-02-09 03:26:02

+0

http://docs.jquery.com/Plugins/Validation/ - 查看第一個示例/演示的「查看源代碼」 – 2012-02-09 03:32:39

+0

我開始認爲我不應該使用asp.net mvc的無阻礙驗證,但只使用插件。 (我知道asp.net mvc使用該插件,但似乎我無法控制導致我很多問題的事情) – Rushino 2012-02-09 13:45:25

0

無論出於何種原因,我有我的Globalize的參考變化來自:

<script src="@Url.Content("~/Scripts/globalize/globalize.js")" type="text/javascript"</script> 

<script type="text/javascript" src="~/Scripts/globalize/globalize.js"</script> 

而且這解決了我的問題。瘋了30分鐘,直到我開始工作。如果有人能解釋我爲什麼要申請。