MVC WebGrid Dynamic Columns
本文关键字:Columns Dynamic WebGrid MVC | 更新日期: 2023-09-27 18:28:23
所以我有一个模型,它包含一个元数据项列表,每个用户都可以自定义。
public class MyModel {
public int ID { get; set; }
public String Name { get; set; }
public DateTime Created { get; set; }
// Need to diplay each as a column
public List<MetaData> Data { get; set; }
}
public class MetaData {
public int ID { get; set; }
public String Name { get; set; }
public String Label { get; set; }
public String Value { get; set; }
}
对于MyModel上的每个元数据项,我需要向WebGrid添加一列,该列的名称作为列名,标签作为标题,并为每个MyModel输出值。
@{
WebGrid grid = new WebGrid(source: Model, rowsPerPage: 5, canPage: true);
List<WebGridColumn> cols = new List<WebGridColumn>();
cols.Add(grid.Column("Name", "Name"));
cols.Add(grid.Column("Created"));
for (int i = 0; i < Model.FirstOrDefault().Data.Count; i++)
{
cols.Add(grid.Column(Model.FirstOrDefault().Data[i].Name, Model.FirstOrDefault().Data[i].Label,
format: item => @<text>@item.Data[i].Value</text>
));
}
}
@grid.GetHtml(
tableStyle: "table",
htmlAttributes: new { id = "MyGrid" },
columns: cols)
元数据列在所有MyModels之间共享,因此每个MyModels不会有一组新的列。在不同的MyModel中,名称和标签将是相同的。如果有人能帮忙,我们将不胜感激。
当lambda语法变得过于复杂时,可以切换到使用Html.Raw
。此外,由于运行时试图使用i
的最后一个值,因此索引似乎存在某种"修改的闭包"问题——您可以通过制作i
的"本地"(循环内)副本来解决此问题。这对我有效:
for (int i = 0; i < Model.First().Data.Count; i++)
{
int local = i;
cols.Add(grid.Column(Model.First().Data[i].Name, Model.First().Data[i].Label,
format: item => Html.Raw("<text>" + item.Data[local].Value + "</text>")
));
}
编辑
破解"格式"lambda。。。这显然也有效:
format: item => @item.Data[local].Value