MVC WebGrid 动态列

3

我有一个模型,其中包含一组元数据项的列表,每个用户都可以自定义。

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之间共享,因此每个模型不会有新的列集。名称和标签将在不同的MyModel中保持相同。如果有人能够帮助,将不胜感激。

1个回答

2

当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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接