2014-02-05 60 views
1

我在我的應用程序中使用MVC的WebGrid,它一直在工作很好。我在我的控制器代碼中設置網格的列,然後將其傳遞給我的視圖。我添加了一個新列這樣的地方columnsList<MvcWebGridColumn>綁定MVC WebGrid列到源的字典屬性值

columns.Add(new WebGridColumn { ColumnName = "Path", Header = "Full Path", Filter = ... }); 

然後在我看來,我把從我的視圖模型網格列如下:

@grid.GetHtml(
    footerStyle: "hide", 
    mode: WebGridPagerModes.All, 
    htmlAttributes: new { id = @Model.Id }, 
    columns: @Model.Columns) 

直到此時,設置代碼中的列已經很好地工作,因爲已經知道這些列是我的模型的第一級屬性。現在情況變得更加複雜,我不知道如何使用WebGrid處理它。下面是一個例子模型:

public class Requirement 
{ 
    public string Id { get; set; } 
    public string Path { get; set; } 
    public Dictionary<string, string> Fields { get; set; } 
} 

我希望能夠利用從Field字典屬性的關鍵值的代碼來設置的WebGrid的專欄。我想這一點,但它不工作:

columns.Add(new WebGridColumn { ColumnName = String.Format("Fields[\"{0}\"]", key), Header = label }); 

我試圖把同樣的方法GetFieldValue(string key)方法對我Requirement模型,但它不喜歡,要麼。它似乎只能處理完全匹配對象的屬性標識符。

我不確定這是否可以使用WebGrid開箱即用,或者我必須擴展功能。提前致謝。

+0

這篇文章可能會幫助你:http://stackoverflow.com/questions/18317207/mvc-webgrid-dynamic-columns – ataravati

+0

感謝您的鏈接,但該人知道子屬性標識符。我想通過鍵從Dictionary屬性中獲取一個列的值。 – im1dermike

回答

0

我相信我只是想出了一種處理這個問題的方法,這看起來不算太難。

爲了重申問題,我相信MVC WebGrid使用反射來設置ColumnName屬性,因此您輸入的字符串需要通過對象的API直接訪問,例如。 "Id","Field.Address.Name"等。在我的情況下,問題是,我需要我的列的行的值來自一個詞典,它似乎並不像你可以傳遞參數(鍵,索引等)到ColumnName得到我需要的價值。

我的解決方案是在解析要顯示的值時完全避免使用WebGrid的ColumnName屬性。我只是輸入一個我知道存在的ColumnName的網格模型的值,在我的情況下是「Id」。這僅僅用於WebGrid的渲染。然後,由於WebGridColumn的Format使用動態的功能,我可以使用任何我想要的定義我的列值:

columns.Add(new WebGridColumn 
{ 
    ColumnName = "Id", 
    Header = field.Label, 
    Format = x => new HtmlString(x.Value.GetEntityFieldValue(field.Field)) 
}); 

我很快意識到,這會搞亂排序。 MVC WebGrid的黑盒排序只是簡單地在排序查詢中使用ColumnName,因此我現在每列都有「?sort = Id」。如果你沒有排序,那麼你沒問題。如果你是,你必須實現一個自定義的排序解決方案,就像我目前正在做的那樣。