我正在使用不显眼的验证来处理本地化的mvc3 Web应用程序。 在web.config中我得到了:
<globalization culture="pl-PL" uiCulture="pl" />
Jquery 1.4.4和jquery验证1.6正在使用中。
问题在于十进制数字分隔符。
我可以看到jquery验证忽略了文化,并期望点字符始终是小数点分隔符。我需要使用逗号代替。我认为例如德语也是如此。
我创建了自己的methods_pl.js文件:
jQuery.extend(jQuery.validator.methods, {
number: function(value, element) {
return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
}
});
以上解决了根本无法识别十进制数的基本问题。
但是当我尝试在我的模型Decimal Price属性上使用RangeAttribute时,它仍然不起作用。 怎么解决这个问题?
答案 0 :(得分:4)
如果您设置
key="UnobtrusiveJavaScriptEnabled" value="false"
上一个答案中发布的DecimalModelBinder
可以使用,但您正在禁用客户端验证。
要解决您的问题,您需要包含正确的jQuery语言环境。 看一下this post from Scott Hanselmann或this post他们应该为您提供实施帮助。
你应该在你的DOMready函数中添加Jquery.globalize插件形式NuGet然后添加类似的东西以正确验证数字(至少它适用于我)
$.validator.methods.number = function (value, element) {
if (Globalize.parseFloat(value))
return true;
return false;
}
Globalize.culture('fr-FR');
然后在页面中添加相关脚本
<script src="@Url.Content("~/Scripts/jquery-1.7.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.fr-FR.js")" type="text/javascript"></script>
答案 1 :(得分:1)
在帖子中,他擅长做以下事情:
using System;
using System.Globalization;
using System.Web.Mvc;
public class DecimalModelBinder : IModelBinder {
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext) {
ValueProviderResult valueResult = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName);
ModelState modelState = new ModelState { Value = valueResult };
object actualValue = null;
try {
actualValue = Convert.ToDecimal(valueResult.AttemptedValue,
CultureInfo.CurrentCulture);
}
catch (FormatException e) {
modelState.Errors.Add(e);
}
bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
return actualValue;
}
}
然后在Global.asax
中ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
我不确定这是否能解决客户端上的问题(Phil似乎表明它可以正常工作),但它应该至少解决服务器端的问题。