AaronLS
AaronLS

Reputation: 38392

Template that shows properties with certain attributes?

I am creating an object template that will show only a few fields of a model class, to be used as a summary of the object. I created a Summary attribute and flagged certain fields with that attribute. I can't figure out how to actually determine if the property has that attribute though, because in the object template I don't have the actual property, but instead a ModelMetadata instead. How can I determine if the property has the Summary attribute in the object template?

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

}

This is my object templatE:

@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>
}

Upvotes: 0

Views: 83

Answers (1)

marcind
marcind

Reputation: 53191

The best way to achieve what you want is by changing your SummaryAttribute to implement IMetadataAware. This is an extensibility mechanism that allows metadata attributes to provide additional information to the ModelMetadata object:

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

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

then your property check could be

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

If you cannot change the implementation of SummaryAttribute or derive from it, then you could consider using the built-in AdditionalMetadataAttribute

Upvotes: 1

Related Questions