C# 自定义DataAnnotation属性
当我在ASP.NET MVC 3模型中使用DisplayAttribute时,编写它们很快就会变得很痛苦,因为我们要么硬编码字符串,要么从包含C# 自定义DataAnnotation属性,c#,asp.net-mvc,asp.net-mvc-3,data-annotations,C#,Asp.net Mvc,Asp.net Mvc 3,Data Annotations,当我在ASP.NET MVC 3模型中使用DisplayAttribute时,编写它们很快就会变得很痛苦,因为我们要么硬编码字符串,要么从包含常量字符串的某个静态类中引用字符串(这就是我现在所拥有的,请参见下文)。但这对我来说也太过分了 我想提出一个名为[SimpleDisplay]的属性,它通过查看 类名 属性附加到的属性名称 这可能吗 像这样的 public class Product { [SimpleDisplay] // it will take Product and Name
常量字符串的某个静态类中引用字符串(这就是我现在所拥有的,请参见下文)。但这对我来说也太过分了
我想提出一个名为[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,因为它是密封的。我还有其他选择吗?这有意义吗?我会尝试创建一个标准属性和自定义属性。您可以重写CreateMetadata方法,该方法获取IEnumerable
。您应该搜索您的属性
attributes.OfType<SimpleDisplayAttribute>().FirstOrDefault();
attributes.OfType().FirstOrDefault();
并以您想要的任何方式填充模型元数据。如果我正确理解了您的意思,您可以创建一个简单的自定义属性,如下所示:
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; }
这无助于将属性合并到属性中。事实上,它使事情变得复杂,因为它再次依赖于硬编码参数而不是无参数(或强类型参数)。谢谢,这是正确且最好的方法。这里概述了有关您的方法的更多详细信息