mvc3 jquery unobtrusive验证语言环境十进制字段

时间:2011-05-21 22:59:50

标签: asp.net-mvc-3 unobtrusive-validation

我正在使用不显眼的验证来处理本地化的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时,它仍然不起作用。 怎么解决这个问题?

2 个答案:

答案 0 :(得分:4)

如果您设置

key="UnobtrusiveJavaScriptEnabled" value="false"

上一个答案中发布的DecimalModelBinder可以使用,但您正在禁用客户端验证。

要解决您的问题,您需要包含正确的jQuery语言环境。 看一下this post from Scott Hanselmannthis 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)

Phil Haack发布了有关此问题的一些信息。

See here.

在帖子中,他擅长做以下事情:

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似乎表明它可以正常工作),但它应该至少解决服务器端的问题。