2013-08-19 100 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