. - . , CreateCheckBoxTable - CertBodyVM, CheckBox ( ), , :
Public Module MyModule
Private indexerMethod As MethodInfo = GetType(IList(Of CertBodyVM)).GetMethod("get_Item")
Private certSelectedProperty As PropertyInfo = GetType(CertBodyVM).GetProperty("CertSelected")
Private certNameProperty As PropertyInfo = GetType(CertBodyVM).GetProperty("CertName")
Private certBodyIdProperty As PropertyInfo = GetType(CertBodyVM).GetProperty("CertBodyId")
<Extension()> _
Public Function CreateCheckBoxTable(Of TModel)(ByVal helper As HtmlHelper(Of TModel), ByVal ex As Expression(Of Func(Of TModel, IList(Of CertBodyVM)))) As IHtmlString
Dim table = New TagBuilder("table")
Dim metadata = ModelMetadata.FromLambdaExpression(ex, helper.ViewData)
Dim bodies = CType(metadata.Model, List(Of CertBodyVM))
Dim tableBody = New StringBuilder()
For i = 0 To bodies.Count - 1
Dim ex1 = MakePropertyExpression(Of TModel, Boolean)(ex, certSelectedProperty, i)
Dim ex2 = MakePropertyExpression(Of TModel, String)(ex, certNameProperty, i)
Dim ex3 = MakePropertyExpression(Of TModel, Integer)(ex, certBodyIdProperty, i)
Dim tr = New TagBuilder("tr")
Dim td = New TagBuilder("td")
td.InnerHtml = String.Concat(
helper.CheckBoxFor(ex1),
helper.DisplayFor(ex2),
helper.HiddenFor(ex3)
)
tr.InnerHtml = td.ToString()
tableBody.Append(tr.ToString())
Next
table.InnerHtml = tableBody.ToString()
Return New HtmlString(table.ToString())
End Function
Private Function MakePropertyExpression(Of TModel, TProperty)(ByRef ex As Expression(Of Func(Of TModel, IList(Of CertBodyVM))), ByRef pi As PropertyInfo, ByVal i As Integer) As Expression(Of Func(Of TModel, TProperty))
Return Expression.Lambda(Of Func(Of TModel, TProperty))(
Expression.Property(
Expression.Call(ex.Body, indexerMethod, Expression.Constant(i)),
pi
),
ex.Parameters()
)
End Function
End Module
:
@ModelType xxxxxx.CourseModel
...
@Html.CreateCheckBoxTable(Function(x) x.Bodies)