如何在编辑器模板中使用自定义htmlhelper包含完整属性名称

hob*_*ell 1 vb.net asp.net-mvc html-helper mvc-editor-templates

我有一个注册表单,我试图在其中放置Html.EditorFor()。

例如:

@ModelType RegisterViewModel 
    <othermarkup />
<div>
    @Html.LabelFor(Function(m) m.ConfirmPassword, New With {.class = "required"})
    <div>
        @Html.PasswordFor(Function(m) m.ConfirmPassword)
        @Html.ValidationMessageFor(Function(m) m.ConfirmPassword)
    </div>
</div>

<div>
    @Html.EditorFor(Function(m) m.AlertSettings)
</div>
<othermarkup />
Run Code Online (Sandbox Code Playgroud)

RegisterViewModel包含一个名为AlertSettings的属性(类型为AlertSettingsViewModel),AlertSettingsViewModel.vbhtml的编辑器模板如下所示:

@ModelType AlertSettingsViewModel
    <othermarkup />
<div class="panel-heading">Personalized Alert Settings</div>
<div class="panel-body">
    <div class="col-sm-6">
        <div>
            <label for="Disciplines">Disciplines</label>
            @Html.ValidationMessageFor(Function(m) m.Disciplines)
            @Html.CheckBoxListFor(Function(m) m.Disciplines, SelectLists.Disciplines())
        </div>

        <div class="visible-xs"><br /></div>
    </div>
</div>
<othermarkup />
Run Code Online (Sandbox Code Playgroud)

AlertSettingsViewModel的Disciplines属性是一个整数数组。

我正在使用自定义的HtmlHelper生成复选框列表。它由以下两个方法组成(第一个调用第二个):

''' <summary>
''' Returns a checkbox for each of the provided <paramref name="items"/>.
''' </summary>
<System.Runtime.CompilerServices.Extension>
Public Function CheckBoxListFor(Of TModel, TValue)(htmlHelper As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TValue)), items As IEnumerable(Of SelectListItem), Optional htmlAttributes As Object = Nothing) As MvcHtmlString
    Dim listName = ExpressionHelper.GetExpressionText(expression)
    Dim metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData)

    items = GetCheckboxListWithDefaultValues(metaData.Model, items)
    Return htmlHelper.CheckBoxList(listName, items, htmlAttributes)
End Function




''' <summary>
''' Returns a checkbox for each of the provided <paramref name="items"/>.
''' </summary>
<System.Runtime.CompilerServices.Extension>
Public Function CheckBoxList(htmlHelper As HtmlHelper, listName As String, items As IEnumerable(Of SelectListItem), Optional htmlAttributes As Object = Nothing) As MvcHtmlString
    Dim Result As String = ""
    For Each item In items
        Dim div = New TagBuilder("div")
        div.MergeAttributes(New RouteValueDictionary(htmlAttributes), True)
        div.MergeAttribute("class", "checkbox") ' default class

        Dim label = New TagBuilder("label")

        Dim cb = New TagBuilder("input")
        cb.MergeAttribute("type", "checkbox")
        cb.MergeAttribute("name", listName)
        cb.MergeAttribute("value", If(item.Value, item.Text))
        If item.Selected Then
            cb.MergeAttribute("checked", "checked")
        End If

        label.InnerHtml = cb.ToString(TagRenderMode.SelfClosing) & item.Text

        div.InnerHtml = label.ToString()

        Result &= div.ToString()
    Next

    Return New MvcHtmlString(Result)
End Function
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当调用编辑器模板时,最终对ExpressionHelper.GetExpressionText(expression)的调用仅返回立即属性名称(例如“学科”),而不是上下文中的全名(例如“ AlertSettings”)。纪律”)。

如何获得全名而不是直接名?这是我第一次尝试使用编辑器模板,但在查找此特定用例的示例时遇到了一些困难。

hob*_*ell 5

通过替换以下内容,我得以解决此问题:

Dim listName = ExpressionHelper.GetExpressionText(expression)
Run Code Online (Sandbox Code Playgroud)

与:

Dim listName = htmlHelper.NameFor(expression).ToString
Run Code Online (Sandbox Code Playgroud)

在CheckboxListFor方法中。

希望这会对其他人有所帮助。