C# 自定义DataAnnotation属性

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

当我在ASP.NET MVC 3模型中使用DisplayAttribute时,编写它们很快就会变得很痛苦,因为我们要么硬编码字符串,要么从包含
常量字符串的某个静态类中引用字符串(这就是我现在所拥有的,请参见下文)。但这对我来说也太过分了

我想提出一个名为[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; }
    

    这无助于将属性合并到属性中。事实上,它使事情变得复杂,因为它再次依赖于硬编码参数而不是无参数(或强类型参数)。谢谢,这是正确且最好的方法。这里概述了有关您的方法的更多详细信息