自定义DataAnnotation属性

时间:2011-02-10 11:15:16

标签: c# asp.net-mvc asp.net-mvc-3 data-annotations

当我在ASP.NET MVC 3模型中使用DisplayAttribute时,它很快就会变得很难写,因为我们必须硬编码字符串或从包含const strings的某个静态类引用字符串(这就是我现在,见下文)。但即使这对我来说太过分了。

我想提出一个名为[SimpleDisplay]的属性,它会隐藏地通过查看

构建资源的字符串
  1. 班级名称,
  2. 属性附加到的属性名称。
  3. 这可能吗?

    像这样的东西

    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是不可能的,因为它是密封的。我还有其他选择吗?它甚至有意义吗?

2 个答案:

答案 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; }