Asp.Net MVC:一些未本地化的默认错误消息?

J4N*_*J4N 11 validation asp.net-mvc localization data-annotations

我有一个完全本地化的网站,主要是法语/英语/德语.

现在,一切都很顺利,但我确实注意到asp.net MVC的一些错误消息的问题.

我的模型中有一个属性:

[Required]
[LocalizedDisplayName("PublicationDate", NameResourceType = typeof(LocalizationResources.Views.Composer.BaseInfoForm))]
public DateTime PublicationDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

LocalizedDisplayname是DisplayNameAttribute的扩展,它位于Resx文件中以获取正确的翻译

线程CurrentCulture和CurrentCultureUI在fr-FR中,因此消息应该以法语显示(就像我的[Required]属性一样,自动显示"Le champ Publication est requis").

但是在DateTime的情况下,如果我输入的东西不是日期,验证器只返回一个" The value 'asdfasdf' is not valid for Publication."所以:

  • 为什么MVC有时会以法语返回错误信息,有时用英语回复,同样的形式(我确切地说,这是默认的错误信息)
  • 如何通过指示诸如"La valeur {0} n'est pas une date valide pour le champ {1}"之类的文本来通用地替换此消息

非常感谢你

Cla*_*fou 7

我认为这些回答了你的两个问题:

  • 为什么MVC有时会以法语返回错误信息,有时用英语回复,同样的形式(我确切地说,这是默认的错误信息)

一个值得注意的区别是该[Required]属性执行显式客户端验证,而当您的字段不包含有效的DateTime时,您将通过默认模型绑定器的失败来获取服务器端验证,以从发布的表单数据创建DateTime对象.这是一个完全不同的机制,我想这解释了不同的结果.当然,如果结果一致,那就太好了.

  • 如何通过指示诸如"La valeur {0} n'est pas une date valide pour le champ {1}"之类的文本来通用地替换此消息

有两种方法:

  1. 使用DefaultModelBinder.ResourceClassKey属性告诉默认模型绑定器用于错误消息的资源字符串.有关如何实现此问题的说明,请参阅此相关问题的答案(对于MVC 2,但在MVC 3中没有更改)
  2. 一个更好的方法(我认为)是进行客户端验证.这允许您从本地化资源提供所需的错误消息字符串.通过添加DataType如下所示的属性来做到这一点,假设您创建了一个名为MyLocalizedResources字符串的资源类,该字符串的密钥DateTimeFormatValidationMessage用法语翻译为"La valeur {0} n'est pas une date valide pour le champ {1}":

    [Required]
    [DataType(DataType.Date, ErrorMessageResourceType = typeof(MyLocalizedResources), ErrorMessageResourceName = "DateTimeFormatValidationMessage")]
    [LocalizedDisplayName("PublicationDate", NameResourceType = typeof(LocalizationResources.Views.Composer.BaseInfoForm))]
    public DateTime PublicationDate { get; set; }
    
    Run Code Online (Sandbox Code Playgroud)