Mvc3 HtmlHelper Method to Create a Checkbox Formatted Table

This is the mvc3 Razor project at vb.net. I need to create a dynamic table in which 1) can contain from 1 to 3 columns and from 1 to many rows ... Table elements are checkboxes. I already have helper methods in the class below, but the method below is pushed to return, since it just returns the string along with the actual string of the Ntd function, this is just to give an idea of ​​what should happen at that moment ... I'm lost to generate these flags in the distance that can be linked, so the controller’s post-permissions method will save ... If I just clear all the flags on the page, they will save and update correctly. The layout is just a sore eye.

This is the current view.

@ModelType xxxxxx.CourseModel

@Code
    ViewData("Title") = "Edit Courses"
End Code

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"  type="text/javascript"></script>

@Using Html.BeginForm(Nothing, Nothing, FormMethod.Post, New With {.enctype = "multipart/form-data"})
    @Html.ValidationSummary(True)

    @<fieldset>
        <legend>Edit Courses</legend>
        @Html.HiddenFor(Function(model) model.cId)
        <table style="float: left">
            <tr>
                <th>Certification Bodies</th>
            </tr>
            <tr>
                @For _i As Integer = 0 To Model.Bodies.Count - 1
                    Dim i = _i
                    @<td>
                        @Html.CheckBoxFor(Function(model) model.Bodies(i).certSelected)
                        @Html.DisplayFor(Function(f) f.Bodies(i).certName)
                        @Html.HiddenFor(Function(model) model.Bodies(i).certBodyId)
                    </td>
                Next
            </tr>
            <tr>
                <th><input type="submit" value="Save" /></th>
            </tr>
        </table>
    </fieldset>
end using

This is a helper method.

<Extension()> _
Public Function CreateCheckBoxTable(ByVal helper As HtmlHelper, ByVal d As List(Of CertBodyVM)) As MvcHtmlString
    Dim htmlDisplayer As String = Table()
    Dim counter As Integer = 0
    For Each item In d
        If counter = 0 Then
            htmlDisplayer = htmlDisplayer + NRow()
        End If
        counter += 1
        If Not counter >= 3 Then
            htmlDisplayer = htmlDisplayer + Ntd("@Html.CheckBoxFor(Function(model) model.Bodies(i).certSelected)@Html.DisplayFor(Function(f) f.Bodies(i).certName)@Html.HiddenFor(Function(model) model.Bodies(i).certBodyId)")
        Else
            counter = 0
            htmlDisplayer = htmlDisplayer + CRow()
        End If
    Next
    htmlDisplayer = htmlDisplayer + CTable()
    Dim x As MvcHtmlString = MvcHtmlString.Create(htmlDisplayer)
    Return x
End Function

Public Function Table() As String
    Return String.Format("<table>")
End Function
Public Function CTable() As String
    Return String.Format("</table>")
End Function
Public Function NRow() As String
    Return String.Format("<tr>")
End Function

Public Function TdEnd() As String
    Return String.Format("</td>")
End Function

Public Function CRow() As String
    Return String.Format("</tr>")
End Function

Public Function Ntd(ByVal text As String) As String
    Return String.Format("<td>{0}</td>", text)
End Function

,

 @Html.CreateCheckBoxTable(Model.Bodies)

, checkboxfor..

.

<tr><td><table><tr><td>@Html.CheckBoxFor(Function(model) model.Bodies(i).certSelected)@Html.DisplayFor(Function(f) f.Bodies(i).certName)@Html.HiddenFor(Function(model) model.Bodies(i).certBodyId)</td></table></td></tr>
+5
2

. - . , 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)
+4

htmlDisplayer = htmlDisplayer + Ntd(helper.CheckBoxFor(Function(model) model.Bodies(i).certSelected)helper.DisplayFor(Function(f) f.Bodies(i).certName)helper.HiddenFor(Function(model) model.Bodies(i).certBodyId))
+1

All Articles