可以通过创建自定义 GridModel。
在这里,我将我的网格基于一个填充了 IDictionaries 的 IList,但这对于从 DataTable 获取的数据也应该是可能的。
诀窍是将数据结构交给自定义GridModel的构造函数,让自定义GridModel根据数据结构生成列。
它有点难看,但效果很好。
(在 VB.NET 中使用有趣的 lambda 表达式更难看)
控制器动作代码:
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")))