获取任意类型的属性的DisplayName

时间:2013-01-28 20:50:00

标签: c# asp.net-mvc

我无法找到一个干净的方法来做到这一点。我有一个ViewModel类,其中包含表的行集合。我希望能够对@Html.DisplayNameFor()集合中的类型执行strongly-typed,而无需引用集合中的第一个项目或创建该类型的新实例。所以在这里澄清一个例子:

public class TableViewModel
{
  public string Title { get; set; }
  public IEnumerable<Row> Rows { get; set; }
}

public class Row
{
  public int ColumnA { get; set; }
  public int ColumnB { get; set; }
}

//In the Razor view
<table>
  <tr>
    <th>@Html.DisplayNameFor(???)</th>
  </tr>
</table>

有没有办法在不执行@Html.DisplayNameFor(x => x.Rows.First().ColumnA)的情况下执行此操作?

2 个答案:

答案 0 :(得分:1)

您可以使用this.ViewData.ModelMetadata.Properties集合并调用GetDisplayName方法来生成标题单元格内容。我们在代码中通常会这样做,以将任意模型呈现为表格。

编辑: 为了对此进行扩展,我使用了一个表示表和基表的基本模型。我定义了3个类。我有一个TableRowCell' class, a TableRow'类(基本上是TableRowCell个对象的集合)和一个Table类。

public class Table
{
    public Table(String name)
    {
        this.Name = name;
        this.ContentRows = new List<TableRow>();
        this.HeaderRow = new TableRow();
        this.FooterRow = new TableRow();
    } 

    public IList<TableRow> ContentRows
    {
        get;
        private set;
    }

    public TableRow FooterRow
    {
        get;
        private set;
    }

    public TableRow HeaderRow
    {
        get;
        private set;
    }

    public String Name
    {
        get;
        private set;
    }
}

当我有一个包含要在表中显示的对象集合的视图模型时,我首先调用HtmlHelper扩展名,将该集合转换为Table对象。在该方法中,我迭代调用ModelMetadataProviders.Current.GetMetadataForType(null, typeof(TModel)).Properties..Where(item => item.ShowForDisplay)以获取用于生成标题单元格的元数据对象的集合。然后我遍历项目集合并调用ModelMetadataProviders.Current.GetMetadataForType(() => item, typeof(TModel)).Properties..Where(item => item.ShowForDisplay)以获取用于生成内容单元格的元数据对象的集合。

从技术上讲,我的HtmlHelper扩展方法实际上会返回一个TableBuilder对象,该对象上会有一个名为Render的方法,它会生成html。到目前为止,这种设置对我很有帮助。

答案 1 :(得分:0)

public class TableViewModel
{
  public string Title { get; set; }
  public IEnumerable<Row> Rows { get; set; }
  public Row ForNames = null;
}


@Html.DisplayNameFor(x => x.ForName.ColumnA)