我使用自定义资源提供程序从数据库中获取资源字符串。这适用于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类已被密封。对于验证属性,不存在相应的类。
答案 0 :(得分:7)
我提出的最干净的方法是覆盖DataAnnotationsModelMetadataProvider
。这是一篇关于如何做到这一点的非常简洁的文章。
答案 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属性以使用数据库资源提供程序对它们进行本地化。您可以继承当前的属性,然后指定其他属性,例如从自定义提供程序获取资源时要使用的数据库连接字符串。