默认模型绑定器的 MVC 本地化

发布于 2024-08-25 02:52:08 字数 901 浏览 10 评论 0原文

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

假设我有一个表单,用户可以在其中输入他们的年龄。然后用户在表单中输入“十”,但没有得到预期的错误

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

消息

“值‘十’对于年龄无效。”

显示。

实体的 Age 属性定义如下:

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

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

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

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

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

I am currently trying to figure out how to localize the error messages generated by MVC. Let me use the default model binder as an example, so I can explain the problem.

Assuming I have a form, where a user enters thier age. The user then enters "ten" in to the form, but instead of getting the expected error of

"Age must be beween 18 and 25."

the message

"The value 'ten' is not valid for Age."

is displayed.

The entity's age property is defined below:

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

After some digging, I notice that this error text comes from the System.Web.Mvc.Resources.DefaultModelBinder_ValueInvalid in the MvcResources.resx file.

Now, how can create localized versions of this file?

As A solution, for example, should I download MVC source and add MvcResources.en_GB.resx, MvcResources.fr_FR.resx, MvcResources.es_ES.resx and MvcResources.de_DE.resx, and then compile my own version of MVC.dll?

But I don't like this idea. Any one else know a better way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

寄离 2024-09-01 02:52:08

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

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

See http://forums.asp.net/p/1512140/3608427.aspx, scroll down to Brad Wilson's reply near the bottom of that page (Sat, Jan 09 2010, 3:20 PM). There are static properties on the DefaultModelBinder that you can set to localize the generic error messages.

The reason a generic error message is used instead of your [Range] message is that [Range] provides a validation error message, but this particular case is a binding error. There's absolutely no way the framework can ever hope to convert the string "ten" to an Int32, so it can't even fire the [Range] validator. This is what the "PropertyValueInvalid" key as mentioned in that forum controls.

深爱不及久伴 2024-09-01 02:52:08

在 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";

In MVC3 do the following to change default messages:

  1. add the App_GlobalResources folder to your ASP.NET site
  2. add a new resource file, call it f.ex. MyResources.resx
  3. add these keys
    • PropertyValueRequired: A value is required.
    • PropertyValueInvalid: The value '{0}' is not valid for {1}.
  4. in Application_Start of global.asax.cs add the line DefaultModelBinder.ResourceClassKey = "MyResources";
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文