现在,一切都进行得很好,但是我确实注意到asp.net MVC有一些错误信息的问题.
我的模型中有一个属性:
[required] [LocalizedDisplayName("PublicationDate",NameResourceType = typeof(LocalizationResources.Views.Composer.BaseInfoForm))] public DateTime PublicationDate { get; set; }
LocalizedDisplayname是DisplayNameAttribute的扩展名,它在Resx文件中进行正确的翻译
线程CurrentCulture和CurrentCultureUI都在fr-FR中,所以消息应该以法语显示(就像我的[必需]属性一样),自动显示“Le champ Publication est requis”.
但是在DateTime的情况下,如果输入的日期不是日期,则验证器只会返回一个“asdfasdf”对于“出版”无效.
所以:
>为什么MVC有时会以法语返回我的错误消息,有时以英文返回,以同样的形式(我确切地说,这是默认的错误消息)
>如何通过表示“La valeur {0} n’est pas une date valide pour le champ {1}”这样的文本来代替这个消息.
非常感谢你
解决方法
- Why MVC returns me sometimes error message in french,and sometimes in english,in the same form(and I precise,it’s the default error message)
一个显着的区别是[必需]属性执行显式的客户端验证,而当您的字段不包含有效的DateTime时,您将通过缺省模型绑定器的失败获得服务器端验证,以从发布的方式创建一个DateTime对象表单数据.这是一个完全不同的机制,我猜这是不同的结果.当然,如果结果是一致的,那将是很好的.
- How to replace this message genericly,by indicating a text like “La valeur {0} n’est pas une date valide pour le champ {1}”
有两种方式:
>告诉默认模型binder使用DefaultModelBinder.ResourceClassKey属性为错误消息使用什么资源字符串.有关如何实现这一点的说明(对于MVC 2,但在MVC 3中没有改变),请参阅this related question的答案
>一个更好的方法(我认为)是做客户端验证.这允许您从本地化的资源提供您希望的错误消息字符串.通过添加下面的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; }