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 в этом посте.

Другие вопросы по тегам