【问题标题】:Custom DataAnnotation attributes自定义 DataAnnotation 属性
【发布时间】:2011-02-11 00:36:23
【问题描述】:

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

我想提出一个类似于 [SimpleDisplay] 的属性,它会通过查看

来隐式构造资源字符串
  1. 类名,
  2. 属性附加到的属性名称。

这可能吗?

类似的东西

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

【问题讨论】:

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


    【解决方案1】:

    我会尝试只创建一个标准属性和自定义 DataAnnotationsModelMetadataProvider。您可以覆盖 CreateMetadata 方法,该方法获得IEnumerable<Attribute>。你应该搜索你的属性

    attributes.OfType<SimpleDisplayAttribute>().FirstOrDefault();
    

    并以您想要的任何方式填充模型元数据。

    【讨论】:

    【解决方案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; }
    

    【讨论】:

    • 这对将属性合并到属性没有任何帮助。事实上,它使事情变得复杂,因为它再次依赖硬编码参数而不是无参数(或强类型参数)。
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    相关资源
    最近更新 更多