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有时会以法语返回错误信息,有时用英语回复,同样的形式(我确切地说,这是默认的错误信息)
一个值得注意的区别是该[Required]
属性执行显式客户端验证,而当您的字段不包含有效的DateTime时,您将通过默认模型绑定器的失败来获取服务器端验证,以从发布的表单数据创建DateTime对象.这是一个完全不同的机制,我想这解释了不同的结果.当然,如果结果一致,那就太好了.
- 如何通过指示诸如"La valeur {0} n'est pas une date valide pour le champ {1}"之类的文本来通用地替换此消息
有两种方法:
DefaultModelBinder.ResourceClassKey
属性告诉默认模型绑定器用于错误消息的资源字符串.有关如何实现此问题的说明,请参阅此相关问题的答案(对于MVC 2,但在MVC 3中没有更改)一个更好的方法(我认为)是进行客户端验证.这允许您从本地化资源提供所需的错误消息字符串.通过添加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) 归档时间: |
|
查看次数: |
9757 次 |
最近记录: |