6

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

4

2 回答 2

4

如果你设置

key="UnobtrusiveJavaScriptEnabled" value="false"

DecimalModelBinder一个答案中发布的内容将起作用,但您正在禁用客户端验证。

要解决您的问题,您需要包含正确的 jQuery 语言环境。看看Scott Hanselmann的这篇文章或这篇文章,他们应该在实施它时给你一些帮助。

您应该添加 Jquery.globalize 插件表单 NuGet 然后在您的 DOMready 函数中添加类似的内容以正确验证数字(至少它适用于我)

 $.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>
于 2011-11-22T08:43:37.960 回答
1

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

看这里。

在帖子中,他描述了以下操作:

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 似乎表明它会起作用),但它至少应该解决服务器端的问题。

于 2011-05-26T05:59:35.893 回答