Шаблон, который показывает свойства с определенными атрибутами? - PullRequest
0 голосов
/ 17 августа 2011

Я создаю шаблон объекта, который покажет только несколько полей модельного класса, которые будут использоваться в качестве сводки объекта. Я создал атрибут Summary и пометил некоторые поля этим атрибутом. Я не могу понять, как на самом деле определить, имеет ли свойство этот атрибут, хотя, потому что в шаблоне объекта у меня нет фактического свойства, а вместо этого ModelMetadata. Как определить, имеет ли свойство атрибут Summary в шаблоне объекта?

public class Car
{
  [Key]
  public int CarKey { get; set;}

  [Summary]
  public string Color { get; set;}

  public string EngineSize { get; set;}

  [Summary]
  public string Model { get; set;}    

  public int NumberOfDoors

}

Это мой шаблон объекта:

@if (Model == null) {
    <text>@ViewData.ModelMetadata.NullDisplayText</text>
} else if (ViewData.TemplateInfo.TemplateDepth > 1) {
    <text>@ViewData.ModelMetadata.SimpleDisplayText</text>
} else {
    <table cellpadding="0" cellspacing="0" border="0">
    @foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm))) {

      if(prop./******************** what goes here ************************/
        if (prop.HideSurroundingHtml) {
            <text>@Html.Display(prop.PropertyName)</text>
        } else {
            <tr>
                <td>
                    <div class="display-label" style="text-align: right;">
                        @prop.GetDisplayName()
                    </div>
                </td>
                <td>
                    <div class="display-field">
                        @Html.Display(prop.PropertyName)
                    </div>
                </td>
            </tr>
        }
    }
    </table>
}

1 Ответ

1 голос
/ 17 августа 2011

Лучший способ достичь того, чего вы хотите, это изменить SummaryAttribute на реализацию IMetadataAware. Это механизм расширяемости, который позволяет атрибутам метаданных предоставлять дополнительную информацию объекту ModelMetadata:

public void OnMetadataCreated(ModelMetadata metadata) {
    if (metadata == null) {
        throw new ArgumentNullException("metadata");
    }

    metadata.AdditionalValues["Summary"] = true;
}

тогда проверка вашего имущества может быть

if(prop.AdditionalValues.ContainsKey("Summary"))

Если вы не можете изменить реализацию SummaryAttribute или извлечь ее из нее, вы можете рассмотреть возможность использования встроенного AdditionalMetadataAttribute

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...