У меня есть регистрационная форма, в которую я пытаюсь поместить 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. Дисциплины »).
Как я могу получить полное имя вместо непосредственного имени? Это моя первая попытка использовать шаблоны редактора, и мне трудно найти примеры для этого конкретного случая использования.
EditorTemplate
вAlertSettingsViewModel.cshtml
(не_AlertSettings
), а затем в представлении его просто@Html.EditorFor(Function(m) m.AlertSettings)
- person   schedule 19.11.2015EditorTemplate
. Он должен называться так же, как модель, находиться в папке/Views/Shared/EditorTemplates
и вызываться с помощью@Html.EditorFor(Function(m) m.AlertSettings)
- person   schedule 20.11.2015htmlHelper.Checkbox(listname)
, сохранялась, несмотря на это. - person hobwell   schedule 20.11.2015