14

我使用自定义资源提供程序从数据库中获取资源字符串。这适用于 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 类是密封的。对于验证属性,不存在相应的类。

4

3 回答 3

7

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

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

于 2012-02-08T08:28:34.287 回答
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设置。更多信息在这里

有了这个,你然后用新属性装饰你的模型,传递你想要从中获取值的资源的键,就像这样

[LocalizedDisplayName("Title")]

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

于 2013-04-10T17:44:09.867 回答
2

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

于 2011-02-26T17:05:09.763 回答