MVC 3 jQueryvalidation/数字/十进制字段的全球化

在Web.config文件中使用全球化文化=“da-DK”时,jQueryvalidation不起作用。

在丹麦,当我们为产品写价格时,我们用符号19,95而不是美国的方式19.95,这给我一个问题,我解决不了。

我已经开始VS2010,新的MVC 3项目,添加一个homeController,一个产品类和一个简单的标准编辑视图,错误已经存在。

产品类别:

public class Product { public string name { get; set; } public string itemNo { get; set; } public decimal price { get; set; } } 

HomeController的:

 public class homeController : Controller { public ActionResult Index() { var product1 = new Product { name = "Testproduct", itemNo = "PRD-151541", price = 19 }; return View(product1); } } 

索引视图:

 @model WebUI.DomainModel.Product <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset> <legend>Product</legend> <div class="editor-label"> @Html.LabelFor(model => model.name) </div> <div class="editor-field"> @Html.EditorFor(model => model.name) @Html.ValidationMessageFor(model => model.name) </div> <div class="editor-label"> @Html.LabelFor(model => model.itemNo) </div> <div class="editor-field"> @Html.EditorFor(model => model.itemNo) @Html.ValidationMessageFor(model => model.itemNo) </div> <div class="editor-label"> @Html.LabelFor(model => model.price) </div> <div class="editor-field"> @Html.EditorFor(model => model.price) @Html.ValidationMessageFor(model => model.price) </div> <p> <input type="submit" value="Save" /> </p> </fieldset> } 

结果:

很抱歉,我无法在此处提交图片 – 请按照以下链接查看结果: http : //www.designvision.dk/temp/mvc3_razor_validation_error.gif

所以 – 当运行网站时,该字段将被设置为19,00–这是正确的文化定义 – 但是当试图保存时,validation失败。

请帮忙…

你可以试试微软的jQuery全球化插件 :

 <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/jquery.glob.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/globinfo/jquery.glob.da-dk.js")" type="text/javascript"></script> <script type="text/javascript"> $.validator.methods.number = function (value, element) { return !isNaN($.parseFloat(value)); } $(function () { $.preferCulture('da-DK'); }); </script> 

插件被重命名和移动,你应该使用全球化 (2012年3月)

 <script src="@Url.Content("~/Scripts/jquery.globalize/globalize.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.globalize/cultures/globalize.culture.da-DK.js")" type="text/javascript"></script> <script type="text/javascript"> $.validator.methods.number = function (value, element) { return !isNaN(Globalize.parseFloat(value)); } $(document).ready(function () { Globalize.culture('da-DK'); }); </script> 

更多关于这个在斯科特Hanselman博客文章


使用可选元素支持更新了https://github.com/jquery/globalize当前版本的脚本;

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

@shatl今天有正确的答案。 注意范围属性,你需要下面显示的黑客。 完整的代码添加如下所示:

 @section Scripts { @Scripts.Render("~/bundles/jqueryval") <script type="text/javascript" src="~/Scripts/globalize.js"></script> <script type="text/javascript" src="~/Scripts/globalize.culture.fr-FR.js"></script> <script type="text/javascript"> $.validator.methods.number = function (value, element) { return this.optional(element) || !isNaN(Globalize.parseFloat(value)); } $(document).ready(function () { Globalize.culture('fr-FR'); }); jQuery.extend(jQuery.validator.methods, { range: function (value, element, param) { //Use the Globalization plugin to parse the value var val = $.global.parseFloat(value); return this.optional(element) || ( val >= param[0] && val <= param[1]); } }); </script> } 

我最终在Scott Hanselman的博客中关于这个主题的build议 – 你可以在这里阅读:

http://www.hanselman.com/blog/GlobalizationInternationalizationAndLocalizationInASPNETMVC3JavaScriptAndJQueryPart1.aspx

我不得不做一些改变,以使用全球化,而不是jQuery全球(现在jQuery全球已经死了)。 我在下面的博客文章中写了这个以防有用:

http://icanmakethiswork.blogspot.co.uk/2012/09/globalize-and-jquery-validate.html

仅供将来参考,对我有用的是以下内容:

请记住设置适当的jQuery版本,以及正确的文化,在这个例子中是丹麦文。
如果值中没有句点,则取消注释。

 <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.globalize/globalize.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.globalize/cultures/globalize.culture.da-DK.js")" type="text/javascript"></script> <script type="text/javascript"> $.validator.methods.number = function (value, element) { // if (value.indexOf(".") >= 0) { // return false; // } return (Globalize.parseFloat(value)); } $(document).ready(function () { Globalize.culture('da-DK'); }); jQuery.extend(jQuery.validator.methods, { range: function (value, element, param) { //Use the Globalization plugin to parse the value var val = Globalize.parseFloat(value); return this.optional(element) || (val >= param[0] && val <= param[1]); } }); </script> 

感谢这个页面,救了我很多麻烦,我不得不修复全球化的代码。 瑞典文化不接受点作为分隔符,但由于parseFloat使用底层javasacriptparsing点将被接受为十进制分隔符,但服务器端这些将被拒绝。 为了解决这个问题,我重写了这个parseFloat

 Globalize.orgParaseFloat = Globalize.parseFloat; Globalize.parseFloat = function(value) { var culture = this.findClosestCulture(); var seperatorFound = false; for (var i in culture.numberFormat) { if (culture.numberFormat[i] == ".") { seperatorFound = true; } } if (!seperatorFound) { value = value.replace(".", "NaN"); } return this.orgParaseFloat(value); }; 

我已经在他们的Github上打开了一张票,所以也许这将被修复

经过一番研究…我find了一个解决scheme。

<system.web>添加Web.config

 <globalization culture="auto" uiCulture="auto" enableClientBasedCulture="true"/> 

扩展HtmlHelper类

 namespace System.Web.Mvc { public static class LocalizationHelper { public static IHtmlString MetaAcceptLanguage(this HtmlHelper html) { var acceptLang = HttpUtility.HtmlAttributeEncode(Thread.CurrentThread.CurrentUICulture.ToString()); return new HtmlString(string.Format("<meta name=\"accept-language\" content=\"{0}\"/>", acceptLang)); } } } 

_Layout.cshtml<head>结尾添加

 @Html.MetaAcceptLanguage(); <script type="text/javascript"> $(document).ready(function () { var data = $("meta[name='accept-language']").attr("content"); $.global.preferCulture(data); }); </script> 

经过这些改变,我可以用我的网站gui操纵十进制数字。

问候,贾科莫

我来自阿根廷,我很久以前就和这个问题斗争过,我们使用“,”作为小数点分隔符,如果你写“逗号”javascriptvalidation失败,但如果你把“。”,模型将receibe号码翻译成整数(55.60将是5560)

我用这个简单的解决scheme解决了这个问题:

第一 –我升级jqueryvalidation图书馆,使用新的cdn地址: http : //jqueryvalidation.org/

我包括在我的JavaScript的链接是这样的:

 <script src="ajax/jquery.validate/1.13.0/jquery.validate.js"></script> <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/jquery.validate.min.js"></script> <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/additional-methods.js"></script> <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/additional-methods.min.js"></script> 

如果你想用一种特定的语言(在我的西class牙语)它也添加这一行:

 <script src="ajax/jquery.validate/1.13.0/localization/messages_es.js"></script> 

用所需的语言replaceES。

第二 –如果你想要允许数字小键盘,你必须replace“。”。 使用“,”正常工作,将此代码添加到您的页面自动执行:

 $('#txtCurrency').keyup(function () { $('#txtCurrency').val($('#txtCurrency').val().replace(/\./g, ',')); }); 

Presto,问题解决了。

再见。

没有插件

我认为最简单的方法来解决这个没有任何插件只是覆盖默认的validation,如下所示:

 <script type="text/javascript"> $.validator.methods.number = function (value, element) { var regex = /^(\d*)(\,\d{1,2})?$/; //99999,99 return regex.test(value); } </script> 

如果你看看jquery.validate.js的源代码,你会看到它只是testing一个正则expression式像上面的代码,再加上validation如果元素是可选的:

在这里输入图像描述