使用DisplayAttribute和自定义资源提供程序进行ASP.NET MVC 3本地化

时间:2011-02-02 08:42:13

标签: asp.net-mvc asp.net-mvc-3 localization internationalization displayattribute

我使用自定义资源提供程序从数据库中获取资源字符串。这适用于ASP.NET,我可以将资源类型定义为字符串。 MVC 3中模型属性的元数据属性(如[Range],[Display],[Required])需要Resource的类型作为参数,其中ResourceType是.resx文件生成的代码隐藏类的类型。

    [Display(Name = "Phone", ResourceType = typeof(MyResources))]
    public string Phone { get; set; }

因为我没有.resx文件,所以这样的类不存在。如何将模型属性与自定义资源提供程序一起使用?

我想有这样的事情:

    [Display(Name = "Telefon", ResourceTypeName = "MyResources")]
    public string Phone { get; set; }

System.ComponentModel中的DisplayNameAttribute为此目的具有可覆盖的DisplayName属性,但DisplayAttribute类已被密封。对于验证属性,不存在相应的类。

3 个答案:

答案 0 :(得分:7)

我提出的最干净的方法是覆盖DataAnnotationsModelMetadataProvider。这是一篇关于如何做到这一点的非常简洁的文章。

http://buildstarted.com/2010/09/14/creating-your-own-modelmetadataprovider-to-handle-custom-attributes/

答案 1 :(得分:4)

您可以扩展DisplayNameAttribute并覆盖DisplayName字符串属性。我有类似的东西

    public class LocalizedDisplayName : DisplayNameAttribute
    {
        private string DisplayNameKey { get; set; }   
        private string ResourceSetName { get; set; }   

        public LocalizedDisplayName(string displayNameKey)
            : base(displayNameKey)
        {
            this.DisplayNameKey = displayNameKey;
        }


        public LocalizedDisplayName(string displayNameKey, string resourceSetName)
            : base(displayNameKey)
        {
            this.DisplayNameKey = displayNameKey;
            this.ResourceSetName = resourceSetName;
        }

        public override string DisplayName
        {
            get
            {
                if (string.IsNullOrEmpty(this.GlobalResourceSetName))
                {
                    return MyHelper.GetLocalLocalizedString(this.DisplayNameKey);
                }
                else
                {
                    return MyHelper.GetGlobalLocalizedString(this.DisplayNameKey, this.ResourceSetName);
                }
            }
        }
    }
}

对于MyHelper,方法可以是这样的:

public string GetLocalLocalizedString(string key){
    return _resourceSet.GetString(key);
}

显然,您需要添加错误处理并设置resourceReader。更多信息here

这样,您可以使用new属性修饰模型,传递要从中获取值的资源的键,如下所示

[LocalizedDisplayName("Title")]

然后Html.LabelFor将自动显示本地化文本。

答案 2 :(得分:2)

我认为您必须覆盖DataAnnotations属性以使用数据库资源提供程序对它们进行本地化。您可以继承当前的属性,然后指定其他属性,例如从自定义提供程序获取资源时要使用的数据库连接字符串。