我无法找到一个干净的方法来做到这一点。我有一个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)
的情况下执行此操作?
答案 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)