当我在ASP.NET MVC 3模型中使用DisplayAttribute时,它很快就会变得很难写,因为我们必须硬编码字符串或从包含const strings
的某个静态类引用字符串(这就是我现在,见下文)。但即使这对我来说太过分了。
我想提出一个名为[SimpleDisplay]的属性,它会隐藏地通过查看
构建资源的字符串这可能吗?
像这样的东西
public class Product {
[SimpleDisplay] // it will take Product and Name and do something like this Product_Name
public string Name { get; set; }
}
如果可能的话,这就是我想要摆脱的:
[Display(ResourceType = typeof(Resources.Localize), Name = ResourceStrings.product_prettyid)]
public virtual int PrettyId
{
get;
set;
}
[Display(ResourceType = typeof(Resources.Localize), Name = ResourceStrings.product_name)]
public virtual string Title
{
get;
set;
}
现在我知道继承DisplayAttribute是不可能的,因为它是密封的。我还有其他选择吗?它甚至有意义吗?
答案 0 :(得分:5)
我会尝试创建一个标准属性和自定义 DataAnnotationsModelMetadataProvider 。您可以覆盖 CreateMetadata 方法,该方法获得IEnumerable<Attribute>
。您应该搜索属性
attributes.OfType<SimpleDisplayAttribute>().FirstOrDefault();
以任何您想要的方式填充模型元数据。
答案 1 :(得分:2)
如果我正确理解你的意思,你可以创建一个简单的自定义属性,如下所示:
public class LocalizedDisplayNameAttribute : DisplayNameAttribute {
public LocalizedDisplayNameAttribute(string expression) : base(expression) { }
public override string DisplayName {
get {
try {
string[] vals = base.DisplayName.Split(',');
if(vals != null && vals.Length == 2)
return (string)HttpContext.GetGlobalResourceObject(vals[0].Trim(), vals[1].Trim());
} catch {}
return "{res:" + base.DisplayName + "}";
}
}
}
然后,您可以将其用作您的属性的属性。 MVC HTML扩展程序将获取您的自定义属性。
[LocalizedDisplayName("LBL, lbl_name1")]
public string[] Name1 { get; set; }