2013-08-19 59 views
2

所以我有一个模型,其中包含一个元数据项目列表,每个用户可定制。MVC WebGrid动态列

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我需要将列添加到具有名称作为列名,标签作为标题,和每个为MyModel输出的值的WebGrid每个元数据项。

@{ 
    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中都是相同的。如果任何人都可以提供帮助,将不胜感激。

回答

2

当lambda语法太复杂时,可以切换到使用Html.Raw。另外,看起来你对索引有一个"modified closure"问题,因为运行时试图使用最后一个值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>") 
    )); 
} 

编辑

黑客在 “格式” 拉姆达......这显然也适用:

format: item => @item.Data[local].Value