Можете ли вы добавить дополнительные метаданные через аннотации данных в свойство базовой модели из дочерней модели? - PullRequest
0 голосов
/ 21 марта 2012

В настоящее время я работаю над проектом asp.net mvc 3, где я использую пользовательский атрибут с именем [ColumnHeading] для украшения свойств, которые я хочу отобразить в сетке.У меня есть базовая модель, у которой есть пара свойств, которые иногда необходимо отображать в сетке дочернего класса.

Пример:

public class BaseClass
{
  public String Status { get; set; }
}

public class ChildClass : BaseClass
{
  [Display(Name="Property 1")]
  [ColumnHeading]
  public String Property1 { get; set; }

  [Display(Name = "Property 2")]
  [ColumnHeading]
  public String Property2 { get; set; }
}

Я не знаю, имеет ли этоменя уже спрашивали (поиск около 3 часов), и если это вообще возможно, но можете ли вы добавить атрибут [ColumnHeading] в свойство базового класса в дочернем классе, например?

public class ChildClass : BaseClass
{
  public ChildClass()
  {
    // Fictional method to add attribute to property
    AddAdditionalMetaData(Status, [ColumnHeading]);
  }
  ...
}

Я знаю, что выможет сделать свойство базового класса virtual или создать модель представления базового и дочернего класса, но проект имеет более 40 моделей, которые наследуются от базового класса, и около 30 дочерних классов должны отображать это свойство базового класса,так что просмотр моделей на самом деле не стоит того, чтобы за одно свойство дополнительно.

Во-вторых, я должен переопределить свойство несколько раз, что заканчивается бесконечным повторением, которое мне не нравится, но если это единственный способ.Я сделаю это.

Буду признателен за любую помощь.

1 Ответ

3 голосов
/ 21 марта 2012
[AttributeUsage(AttributeTargets.Property, Inherited = true)]
public class ColumnHeadingAttribute
{
    ...

См. Inherited свойство в AttributeUsageAttribute. Если у вас есть это в вашем пользовательском атрибуте, он будет наследоваться дочерним классам. Затем вы можете создать промежуточную базовую модель представления между базовой моделью просмотра и дочерними моделями представления.

public class BaseClass
{
    public virtual string Status { get; set; }
}

public abstract class IntermediateClass : BaseClass
{
    [ColumnHeading]
    public override string Status { get; set; }
}

public class ChildClass : IntermediateClass
{
    public ChildClass()
    {
        // Status will inherit the ColumnHeading attribute from IntermediateClass
    }
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...