11

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

目前,一切都很好,但我确实注意到一些 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

4 回答 4

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; }
    
于 2012-06-06T14:42:59.923 回答
1

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

我将所有 [Required] 数据注释替换为

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

在资源字符串中“Common_Mandatory_Field”是这样定义的,例子:意大利资源文件::Il campo {0}è obbligatorio.

英文资源文件:: {0} 字段是必需的。

日本资源文件:: {0}フィールドが必需です。</p>

MVC 会将 {0} 替换为关联控件的 [Display] 数据注释值的名称,以防万一。如果您不提供 [Display] 数据注释,则将使用属性定义。

于 2013-06-08T20:04:38.157 回答
1

ASP.NET MVC 框架进行了几个隐式验证:一个是必需的验证,另一个是值是否对属性有效或无效的验证,即使我们没有用数据注释装饰属性,这两个也会发生。

您必须在全局资源类中PropertyValueInvalid创建密钥。PropertyValueRequired

该线程将帮助您全球本地化验证

于 2012-06-06T14:41:31.367 回答
0

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

像 [必需] 属性。

一个例子:

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

你可以重写Required属性:

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

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

于 2012-06-09T00:14:53.473 回答