2013-08-19 2 views
2

그래서 사용자마다 사용자 지정할 수있는 메타 데이터 항목 목록이 포함 된 모델이 있습니다. I 컬럼 이름, 헤더와 레이블 각 MyModel 대한 출력 값으로서 이름을 가진 WebGrid에 열을 추가 할 필요 MyModel 각 메타 데이터 항목 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; } 
} 

.

@{ 
    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) 

메타 데이터 열은 모든 MyModel간에 공유되므로 각 열마다 새 열 집합이 없습니다. 이름과 레이블은 다른 MyModel에서 동일합니다. 누구든지 도움을 줄 수 있다면 많은 도움이 될 것입니다.

답변

2

람다 구문이 너무 복잡해지면 Html.Raw으로 전환 할 수 있습니다. 또한 런타임에 i의 마지막 값을 사용하려고하기 때문에 색인과 함께 "modified closure" 종류의 문제가있는 것으로 보입니다. 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