十进制模型绑定器不适用于全球化

时间:2017-07-06 16:21:14

标签: c# jquery asp.net-mvc

我将一些数据从客户端发布到服务器,如下所示

$.post(url, myData)
   .done(function (data) {
   });

这里是控制人员的行动

public class MyModel
{
   decimal Precision { get; set; }
}

[HttpPost]
public ActionResult PostInfo(MyModel postBack)
{
}

当我使用英语文化 PostInfo 按预期工作但是当我将文化更改为西班牙语并且精确度 = 1,2时,我收到以下错误

  

值1,2对精度

无效

有人可以告诉我为什么默认模型绑定器在 CurrentCulture 是西班牙语时无法解析1,2?

我在 _Layout.cshtml 中更改了文化。它仅用于测试目的。

@{
    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("es", "ES");
}

1 个答案:

答案 0 :(得分:0)

我最后一次检查时,默认的模型绑定器不处理国际化格式。你必须自己动手。

public class DecimalModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext,
        ModelBindingContext bindingContext)
    {
        var valueResult = bindingContext.ValueProvider
            .GetValue(bindingContext.ModelName);
        var modelState = new ModelState { Value = valueResult };
        object actualValue = null;
        try
        {
            //Check if this is a nullable decimal and a null or empty string has been passed
            var isNullableAndNull = (bindingContext.ModelMetadata.IsNullableValueType &&
                                      string.IsNullOrEmpty(valueResult.AttemptedValue));

            //If not nullable and null then we should try and parse the decimal
            if (!isNullableAndNull)
            {
                actualValue = decimal.Parse(valueResult.AttemptedValue, NumberStyles.Any, CultureInfo.CurrentCulture);
            }
        }
        catch (FormatException e)
        {
            modelState.Errors.Add(e);
        }

        bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
        return actualValue;
    }
}