ASP.NET MVC не находит / не использует шаблон редактора пользовательских типов
Я застрял, пытаясь выяснить, почему мой шаблон не отображается или не найден (поскольку точки останова на шаблоне не ударились). У меня есть такая модель:
public class SomeModel
{
public Dropdown Cities { get; set; }
}
используется в этом представлении
@model Mvc.Models.SomeNamespace.SomeModel
@{
Layout = "../Shared/_Site.cshtml";
}
@Html.ValidationSummary(true)
@using (Html.BeginForm())
{
@Html.EditorForModel()
<input type="submit" value="Continue">
}
где определение раскрывающегося объекта
public class Dropdown
{
public int SelectedValue { get; set; }
public IEnumerable<SelectListItem> Values { get; set; }
public string Placeholder { get; set; }
}
Я создал шаблон редактора для Dropdown в Views/Shared/EditorTemplates/Dropdown.cshtml
@model Mvc.ViewModels.Dropdown
@Html.DropDownListFor(model => model.SelectedValue, Model.Values, Model.Placeholder)
Шокирующая вещь для меня заключается в том, что у меня также есть шаблон DateTime.cshtml по этому пути, который прекрасно работает.
Отображаются все свойства модели, за исключением свойств типа Dropdown, даже свойства DateTime с пользовательским шаблоном.
Я ничего не знаю?
РЕДАКТИРОВАТЬ: уже пытался использовать [UIHint("Dropdown")] в свойстве Cities.
EDIT2: пробовал переименование в DropdownViewModel
1 ответ
По умолчанию шаблоны не превращаются во вложенные сложные объекты. Если вы хотите, чтобы это произошло, вы всегда можете переопределить это поведение по умолчанию, создав ~/Shared/EditorTemplates/Object.cshtml
со следующим содержанием:
@if (ViewData.TemplateInfo.TemplateDepth > 1)
{
@ViewData.ModelMetadata.SimpleDisplayText
}
else
{
foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm)))
{
if (prop.HideSurroundingHtml)
{
@Html.Editor(prop.PropertyName)
}
else
{
if (!String.IsNullOrEmpty(Html.Label(prop.PropertyName).ToHtmlString()))
{
<div class="editor-label">@Html.Label(prop.PropertyName)</div>
}
<div class="editor-field">
@Html.Editor(prop.PropertyName)
@Html.ValidationMessage(prop.PropertyName, "*")
</div>
}
}
}
Вы можете прочитать больше о шаблонах по умолчанию в ASP.NET MVC в этом посте.