Это возможно путем создания пользовательской GridModel.Здесь я основал свою сетку на IList, заполненном IDictionaries, но это также должно быть возможно с данными, взятыми из DataTable.Хитрость заключается в том, чтобы дать структуру данных конструктору пользовательской GridModel и позволить пользовательскому GridModel генерировать столбцы на основе структуры данных.Это немного некрасиво, но работает хорошо.(и это еще страшнее в VB.NET с забавными лямбда-выражениями)
Код действия контроллера:
Dim list As IList(Of IDictionary(Of String, String)) = New List(Of IDictionary(Of String, String))
Dim row1 As IDictionary(Of String, String) = New Dictionary(Of String, String)()
row1.Add("Column1", "ValueColumn1Row1")
row1.Add("Column2", "ValueColumn2Row1")
Dim row2 As IDictionary(Of String, String) = New Dictionary(Of String, String)()
row2.Add("Column1", "ValueColumn1Row2")
row2.Add("Column2", "ValueColumn2Row2")
list.Add(row1)
list.Add(row2)
ViewData("DynamicData") = list
Пользовательская GridModel:
Public Class DynamicGridModel
Inherits MvcContrib.UI.Grid.GridModel(Of IDictionary(Of String, String))
Public Sub New(ByVal dataToRender As IList(Of IDictionary(Of String, String)))
If dataToRender.Count > 0 Then
For Each name As String In dataToRender(0).Keys
Dim columnName As String = name
Column.For(Function(rowData As IDictionary(Of String, String)) rowData(columnName)).Named(columnName)
Next
End If
End Sub
End Class
синтаксис в представлении:
Html.Grid(Of IDictionary(Of String, String))("DynamicData").WithModel(New DynamicGridModel(ViewData("DynamicData")))