显示具有特定属性的属性的模板?

时间:2011-08-16 21:45:02

标签: asp.net-mvc asp.net-mvc-3

我正在创建一个对象模板,它只显示模型类的几个字段,用作对象的摘要。我创建了一个Summary属性,并使用该属性标记了某些字段。我无法弄清楚如何实际确定属性是否具有该属性,因为在对象模板中我没有实际属性,而是具有ModelMetadata。 如何确定属性是否在对象模板中具有“摘要”属性?

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

}

这是我的对象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>
}

1 个答案:

答案 0 :(得分:1)

实现目标的最佳方法是将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