默认模型Binder的MVC本地化

时间:2010-03-17 13:49:00

标签: asp.net asp.net-mvc globalization resx

我目前正在尝试弄清楚如何本地化MVC生成的错误消息。让我使用默认模型绑定器作为示例,所以我可以解释这个问题。

假设我有一个表单,用户进入他的年龄。然后用户在表单中输入“十”,而不是获得

的预期错误
  

“年龄必须在18到25岁之间。”

消息

  

“价值'十'对年龄无效。”

显示

实体的年龄属性定义如下:

    [Range(18, 25, ErrorMessageResourceType = typeof (Errors), 
        ErrorMessageResourceName = "Age", ErrorMessage = "Range_ErrorMessage")]    
    public int Age { get; set; }

经过一番挖掘后,我注意到此错误文本来自System.Web.Mvc.Resources.DefaultModelBinder_ValueInvalid文件中的MvcResources.resx

现在,如何创建此文件的本地化版本?

作为解决方案,例如,我应该下载MVC源并添加MvcResources.en_GB.resxMvcResources.fr_FR.resxMvcResources.es_ES.resxMvcResources.de_DE.resx,然后编译我自己的{{1}版本1}}?

但我不喜欢这个想法。还有其他人知道更好的方法吗?

3 个答案:

答案 0 :(得分:5)

请参阅http://forums.asp.net/p/1512140/3608427.aspx,向下滚动到该页底部附近的Brad Wilson回复(2010年1月9日星期六,下午3:20)。 DefaultModelBinder上有静态属性,您可以设置这些属性来本地化一般错误消息。

使用通用错误消息而不是[Range]消息的原因是[Range]提供验证错误消息,但此特定情况是绑定错误。框架绝对没有办法希望将字符串“ten”转换为Int32,因此它甚至无法触发[Range]验证器。这就是该论坛中提到的“PropertyValueInvalid”键控制。

答案 1 :(得分:3)

在MVC3中,执行以下操作以更改默认消息:

  1. 将App_GlobalResources文件夹添加到ASP.NET站点
  2. 添加一个新资源文件,将其命名为f.ex. MyResources.resx
  3. 添加这些密钥
    • PropertyValueRequired :需要值。
    • PropertyValueInvalid :值“{0}”对{1}无效。
  4. 在global.asax.cs的Application_Start中添加行DefaultModelBinder.ResourceClassKey = "MyResources";

答案 2 :(得分:0)

您是否尝试过:IDataErrorInfo属性

本文将有所帮助