1

我很难找到一种干净的方法来做到这一点。我有一个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)

4

2 回答 2

1

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

编辑:为了对此进行扩展,我使用了一个基本模型,它代表一个表格并且只代表一个表格。我定义了 3 个类。我有一个TableRowCell' class, aTableRow 类(本质上是一个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 的方法。到目前为止,这种设置对我很有帮助。

于 2013-01-28T21:20:00.393 回答
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)
于 2013-01-28T20:59:22.517 回答