在Web.config文件中使用全球化culture =“da-DK”时,jQuery验证不起作用。
在丹麦,当我们为产品写一个价格时,我们使用符号19,95而不是19.95美国,这给了我一个问题,我无法解决。
我已经启动了VS2010,新的MVC 3项目,添加了一个homeController,一个Product类和一个简单的标准编辑视图,错误已经存在。
产品类别:
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 - 这是正确的文化定义 - 但在尝试保存时,验证失败。
请帮忙......
答案 0 :(得分:57)
您可以尝试Microsoft的jQuery Globalization plugin:
<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>
插件已重命名并移动,您应使用Globalize(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>
的详情
答案 1 :(得分:23)
更新了当前版本https://github.com/jquery/globalize的脚本,其中包含可选元素支持
$.validator.methods.number = function (value, element) {
return this.optional(element) || !isNaN(Globalize.parseFloat(value));
}
$(function () {
Globalize.culture('%%culture%%');
});
答案 2 :(得分:14)
@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>
}
答案 3 :(得分:1)
我最后听了Scott Hanselman关于这个主题的博客的建议 - 你可以在这里阅读:
我不得不做一些改变来使用Globalize而不是jQuery Global(现在jQuery Global已经死了)。我在以下博文中写了这篇文章,以防有用:
http://icanmakethiswork.blogspot.co.uk/2012/09/globalize-and-jquery-validate.html
答案 4 :(得分:1)
仅供将来参考,对我有用的是:
请记住设置正确的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>
答案 5 :(得分:0)
感谢这个页面,给我带来了很多麻烦,我不得不修复全球化代码。瑞典文化不接受dot作为分隔符,但由于parseFloat使用底层的javasacript解析点将被接受为十进制分隔符,但服务器端这些将被拒绝。为了解决这个问题,我重写了像这样的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开了一张票,所以可能会修复
答案 6 :(得分:0)
<强>的Web.config 强>
在<system.web>
添加
<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>
在这些更改之后,我可以使用我的web gui操作十进制数字。
此致 贾科莫
答案 7 :(得分:0)
我来自阿根廷,而且我很久以前就在与这个问题作斗争,我们使用“,”作为小数点分隔符,如果你写“逗号”javascript验证失败,但如果你把“。”,模型会收到一个转换为整数的数字(55.60将是5560)
我用这个简单的解决方案解决了这个问题:
1st - 我使用新的cdn地址升级了jquery验证库: http://jqueryvalidation.org/
我在javascript中包含的链接是:
<script src="http://ajax.aspnetcdn.com/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>
如果你想用特定的语言(在我的例子中是西班牙语),也要加上这一行:
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/localization/messages_es.js"></script>
用您想要的语言替换ES。
第二 - 如果要允许数字小键盘十进制,则必须替换“。”使用“,”正常工作,将此代码添加到您的页面以自动执行此操作:
$('#txtCurrency').keyup(function () {
$('#txtCurrency').val($('#txtCurrency').val().replace(/\./g, ','));
});
Presto,问题解决了。
再见。
答案 8 :(得分:0)