MVC3全球化问题

时间:2014-01-22 15:54:10

标签: c# asp.net-mvc asp.net-mvc-3 globalization

我正在开发一个带有下一个文化设置的MVC3应用程序:

<globalization enableClientBasedCulture="true" uiCulture="auto" culture="auto"/>

首先,当我传递一个整数时,我将视图中的值传递给控制器​​,但是当我传递一个double(3.2)时,控制器中的值返回0,如此question中所述。好的模型粘合剂补充说:

protected void Application_Start()
{
  AreaRegistration.RegisterAllAreas();

  ModelBinders.Binders.Add(typeof(double), new DoubleModelBinder());
  RegisterGlobalFilters(GlobalFilters.Filters);
  RegisterRoutes(RouteTable.Routes);

}
public class DoubleModelBinder : 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.ToDouble(valueResult.AttemptedValue,
                CultureInfo.InvariantCulture);
        }
        catch (FormatException e)
        {
            modelState.Errors.Add(e);
        }

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

如果我使用默认文化“en-US”这一切都没关系,但当我尝试将全球化设置为自动(这就是我需要的)时,我的文化是“es-ES”,当我写“3,2”时不要将我的字段检测为数字。问题和答案描述here:使用由microsoft和模型绑定器在jquery中开发的插件。模型绑定器不能解决我的问题,并且微软页面中链接的插件不起作用(断开链接)。我该怎么办?

更新

我从nuget下载了Globalize并根据此link添加了行(我不知道为什么stackoverflow不允许我复制该代码)

停用所有验证。

1 个答案:

答案 0 :(得分:0)

对于服务器端,您必须使用此模型绑定器:

public object BindModel(ControllerContext controllerContext, 
                          ModelBindingContext bindingContext)
        {
            var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            if (string.IsNullOrEmpty(valueResult.AttemptedValue))
            {
                return 0m;
            }
            var modelState = new ModelState { Value = valueResult };
            object actualValue = null;
            try
            {
                actualValue = Convert.ToDecimal(
                    valueResult.AttemptedValue.Replace(",", "."),
                    CultureInfo.InvariantCulture
                );
            }
            catch (FormatException e)
            {
                modelState.Errors.Add(e);
            }

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

对于客户端,请查看此POST