Как включить полное имя свойства с помощью настраиваемой htmlhelper из шаблона редактора

У меня есть регистрационная форма, в которую я пытаюсь поместить Html.EditorFor ().

EG:

@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 />

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 />

Свойство Disciplines в AlertSettingsViewModel является целочисленным массивом.

Я использую собственный 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

Проблема, с которой я столкнулся, заключается в том, что при вызове шаблона редактора конечный вызов ExpressionHelper.GetExpressionText (выражение) возвращает только непосредственное имя свойства (например, «Дисциплины») вместо полного имени в контексте (например, «AlertSettings. Дисциплины »).

Как я могу получить полное имя вместо непосредственного имени? Это моя первая попытка использовать шаблоны редактора, и мне трудно найти примеры для этого конкретного случая использования.


person hobwell    schedule 18.11.2015    source источник
comment
Начните с переименования вас EditorTemplate в AlertSettingsViewModel.cshtml (не _AlertSettings), а затем в представлении его просто @Html.EditorFor(Function(m) m.AlertSettings)   -  person    schedule 19.11.2015
comment
И ваш метод расширения должен использовать встроенные вспомогательные методы html, чтобы вы могли получить полную привязку к модели, а не вручную создавать свои теги.   -  person    schedule 19.11.2015
comment
Спасибо, Стивен. Я пробовал использовать встроенный помощник, но он генерирует скрытое одноименное поле для каждого флажка. Итак, если в моем списке 50 элементов, то в 50 скрытых полях будет указано 50 ложных. Кроме того, если я выбираю элемент, я получаю сообщение об ошибке при попытке преобразовать значение флажка в логическое значение.   -  person hobwell    schedule 19.11.2015
comment
Это потому, что вы неправильно используете EditorTemplate. Он должен называться так же, как модель, находиться в папке /Views/Shared/EditorTemplates и вызываться с помощью @Html.EditorFor(Function(m) m.AlertSettings)   -  person    schedule 20.11.2015
comment
Я забыл упомянуть в своем предыдущем комментарии, что я пошел дальше и внес необходимые изменения, чтобы следовать упомянутым вами соглашениям (я также обновил вопрос). Проблема скрытых полей, представленных с помощью htmlHelper.Checkbox(listname), сохранялась, несмотря на это.   -  person hobwell    schedule 20.11.2015


Ответы (1)


Мне удалось исправить проблему, заменив:

Dim listName = ExpressionHelper.GetExpressionText(expression)

с участием:

Dim listName = htmlHelper.NameFor(expression).ToString

В методе CheckboxListFor.

Надеюсь, это будет полезно кому-то еще.

person hobwell    schedule 19.11.2015
comment
htmlHelper.IdFor(expression) также может быть полезен в этом сценарии - person Binke; 27.05.2019