gpt4 book ai didi

vb.net - Mvc3 HtmlHelper方法生成格式化的复选框表

转载 作者:行者123 更新时间:2023-12-04 19:10:51 24 4
gpt4 key购买 nike

这是 vb.net 中的一个 mvc3 Razor 项目。我需要创建一个动态表,它 1) 可以包含 1 列到 3 列和 1 到多行...表中的项目是复选框。我在下面的类中已经有工作的辅助方法但是下面的方法在返回时被抬高,因为它只是返回字符串以及 Ntd 函数的实际字符串,这只是为了了解此时应该发生的事情......我迷失了生成这些复选框可以绑定(bind),因此 Controller 发布方法将保存...如果我只是转储页面上的所有复选框,它们都会正确保存和更新。布局只是眼睛疼。。

这是当前 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

这是辅助方法
<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

要调用辅助方法,我只是计划将 for each 循环及其内容替换为
 @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>

最佳答案

您的代码将无法正常工作。您将不得不在帮助程序中重新组合 lambda 表达式。我也建议你做这个CreateCheckBoxTable helper 采用 lambda 表达式,而不仅仅是 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)

关于vb.net - Mvc3 HtmlHelper方法生成格式化的复选框表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15194084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com