Пользовательские атрибуты DataAnnotation - PullRequest
2 голосов
/ 10 февраля 2011

Когда я использую DisplayAttribute в моделях ASP.NET MVC 3, это быстро становится трудной задачей, потому что мы должны либо жестко закодировать строку, либо ссылаться на строку из некоторого статического класса, который содержит 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, потому что он запечатан. Какие еще варианты у меня есть? Это вообще имеет смысл?

Ответы [ 2 ]

5 голосов
/ 10 февраля 2011

Я бы попробовал создать только стандартный атрибут и пользовательский DataAnnotationsModelMetadataProvider . Вы можете переопределить метод CreateMetadata , который получает IEnumerable<Attribute>. Вам следует поискать свой атрибут

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

и заполняйте метаданные модели любым удобным для вас способом.

2 голосов
/ 10 февраля 2011

Если у меня есть правильное понимание того, что вы имеете в виду, вы можете просто создать простой пользовательский атрибут, такой как этот:

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 + "}";
        }
    }
}

Затем вы можете использовать его в качестве атрибута своих прав.HTML-расширения MVC подберут ваш пользовательский атрибут.

[LocalizedDisplayName("LBL, lbl_name1")]
public string[] Name1 { get; set; }
...