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

时间:2012-05-22 06:38:13

标签: asp.net-mvc localization validation data-annotations

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

目前,一切都很顺利,但我确实注意到asp.net MVC的一些错误信息有问题。

我的模型中有一个属性:

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

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}”这样的文字来通用地替换此消息

非常感谢

4 个答案:

答案 0 :(得分:7)

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

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

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

  
      
  • 如何通过指示“La valeur {0} n'est pas une date valide pour le champ {1}”这样的文字来通用地替换此消息
  •   

有两种方法:

  1. 使用DefaultModelBinder.ResourceClassKey属性告诉默认模型绑定器用于错误消息的资源字符串。请参阅this related question的答案,了解如何实现此目的(对于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; }
    

答案 1 :(得分:1)

ASP.NET MVC框架执行了几个隐式验证:一个是必需的验证,另一个是值是否对属性有效或不是验证类型,这两个是发生的,尽管我们没有用数据装饰属性-annotations。

您必须在全局资源类中为PropertyValueInvalidPropertyValueRequired创建密钥。

此主题将帮助您Globally localize validation

答案 2 :(得分:1)

我有同样的问题,同样的项目结构。 我终于使用了MVC的惯例,试试这种方式。

我用

替换了所有[必需]数据注释

[必需(ErrorMessageResourceName =“Common_Mandatory_Field”,ErrorMessageResourceType = typeof(MyExternalDllResources.Language))]

在资源字符串中,“Common_Mandatory_Field”以这种方式定义,例如: 意大利资源档案:: Il campo {0}èobbligatorio。

英文资源档案:: <0}字段是必需的。

日本资源档案:: {0}フィールドが必要です。

MVC将使用相关控件的[Display]数据注释值的名称替换{0},如果是这样的话将被翻译。如果您不提供[Display]数据注释,则将使用属性定义。

答案 3 :(得分:0)

您可以本地化自定义验证属性。您还可以本地化ASP.NET MVC内置属性。

与[必需]属性相似。

一个例子:

[LocalizedRequired(ErrorMessage = "You must specify an email address")] 
string SomeProperty { get; set; }

您可以覆盖必需属性:

public class LocalizedRequiredAttribute: RequiredAttribute
{
    public override string FormatErrorMessage(string name)
    {
        return LocalizedString(ErrorMessage, name);
    }
}

以不同语言显示的依据是:我认为mvc在客户端获取当前用户的文化代码。