DisplayAttribute-如何设置默认资源
本文关键字:默认 资源 设置 何设置 DisplayAttribute- | 更新日期: 2023-09-27 18:17:06
我有一个poco类产品
public class Product
{
public int Id {get;set;}
[RequiredEx]
public string ProductName {get;set;}
}
RequiredEx属性只是RequiredAttribute(System.ComponentMode.DataAnnotations`的一个小包装,所以我不必每次都指定资源类型/名称。
public class RequiredExAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute
{
public RequiredExAttribute()
{
this.ErrorMessageResourceType = typeof(ModelResources);
this.ErrorMessageResourceName = "ErrorMessage.Required";
}
}
现在我想用显示属性装饰我的房产
[Display(ResourceType=typeof(ModelResources), Name="Product.ProductName")]
public string ProductName { get; set; }
在这种情况下,我不能仅仅从DisplayAttribute继承,因为它是密封的。我是否有机会在每次使用此属性时不必键入ResourceType=typeof(ModelResources)
?
由于属性是sealed
,并且不是更复杂的OO模型的一部分(基类只是Attribute
,并且没有实现任何接口(,所以我看不出您在这里有任何可用的选项。基本上,我希望答案很简单:"每次都要注意指定ResourceType
"。
如果您只使用DisplayAttribute
的Name
属性,您可以通过继承未密封的(旧的(DisplayNameAttribute
来实现这一点:
using System.Resources;
namespace System.ComponentModel
{
public class LocalisedDisplayNameAttribute
: DisplayNameAttribute
{
readonly ResourceManager m_resourceManager;
readonly string m_resourceName;
public LocalisedDisplayNameAttribute(ResourceManager resourceManager,
string resourceName)
: base()
{
m_resourceManager = resourceManager;
m_resourceName = resourceName;
}
public override string DisplayName
{
get { return m_resourceManager.GetString(m_resourceName); }
}
}
}
然后,您可以为您的公共字符串资源设置显示属性:
public class DisplayBizAttribute
: LocalisedDisplayNameAttribute
{
public DisplayBizAttribute(string resourceName)
: base(StringsBiz.ResourceManager, resourceName)
{
}
}
public class DisplayWebAttribute
: LocalisedDisplayNameAttribute
{
public DisplayBizAttribute(string resourceName)
: base(StringsWeb.ResourceManager, resourceName)
{
}
}
然后,您可以使用字符串文字或常量非常容易地本地化属性显示名称:
[DisplayBiz("ProductName")]
public string ProductName { get; set; }
[DisplayBiz(StringNames.PHONE_NUMBER)]
public string ProductName { get; set; }
[DisplayWeb("EmailAddress")]
public string EmailAddress { get; set; }
更新
这可以通过在每个属性类中声明一个枚举、更改构造函数或添加一个新的构造函数来改进:
public class DisplayBizAttribute
: LocalisedDisplayNameAttribute
{
public enum Name
{
PhoneNumber,
ProductName,
}
public DisplayBizAttribute(Name resourceName)
: base(StringsBiz.ResourceManager, resourceName.ToString())
{
}
}
现在您不必使用硬编码字符串。
[DisplayBiz(DisplayBiz.Name.ProductName)]
public string ProductName { get; set; }
这是你经常做的事情,所以我喜欢添加一个using
来缩短枚举:
using Biz = System.ComponentModel.DisplayBiz.Name;
...
[DisplayBiz(Biz.PhoneNumber)]
public string PhoneNumber { get; set; }