ASP.NET MVC 4中的自定义错误消息未翻译

5
我可以为您翻译 "The field Date must be a date." 这个验证信息。另外,我已经在 Global.asax 的 Application_Start() 中添加了以下的键。
ClientDataTypeModelValidatorProvider.ResourceClassKey = "ModelBinders";
DefaultModelBinder.ResourceClassKey = "ModelBinders";

我已经在App_GlobalResources中创建了ModelBinders.resx、ModelBinders.nl.resx和ModelBinders.fr.resx。

我已在.resx文件中添加了以下字符串资源(或翻译):

Name                   Value
====                   =====
FieldMustBeDate        The field {0} must be a date.
FieldMustBeNumeric     The field {0} must be a number.
PropertyValueInvalid   The value '{0}' is not valid for {1}.
PropertyValueRequired  A value is required.
当我提交一个日期字符串时,我会收到 "FieldMustBeDate" 的翻译。当我提交一个无效的日期(例如 "01/01/201a")时,我会收到默认的 ModelBinders.resx 中定义的未翻译消息 "PropertyValueInvalid",而不是翻译后的消息...我该如何显示 PropertyValueInvalid 的正确翻译?

你能发布你的模型吗? - Vsevolod Goloviznin
1个回答

9
我将解释如何指定客户端消息。首先,在模型中设置资源:
    [Required(ErrorMessageResourceType = typeof(Resources.ModelBinders), ErrorMessageResourceName = "Required")]
    [Display(Name = "UserName", ResourceType = typeof(Resources.ModelBinders))]
    public string UserName { get; set; }

其次,在控制器中,您可以覆盖线程文化(Culture),例如在Initialize方法中,从路由获取:
    protected override void Initialize(RequestContext requestContext)
    {
        string cultureInfo = requestContext.RouteData.GetRequiredString("cultureInfo");
        System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(cultureInfo);
        System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(cultureInfo);
        base.Initialize(requestContext);
    }

英语客户端信息

西班牙语客户端信息

资源的正确格式非常重要:ModelBinders.resx,ModelBinders.es-ES.resx,ModelBinders.en-US.resx......不要有其他文件,这对我很有效。希望这种方法能对您有所帮助。


谢谢!我也做了同样的事情,但没有覆盖控制器的初始化方法。添加那段代码让它对我起作用了。 - LDW
请确保不要将设置线程语言的代码添加到Action Filters的OnActionExecuting方法中 - 这样做是无效的! - cyptus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接