ASP.NET MVC无法查找/使用自定义类型编辑器模板

时间:2016-06-10 08:09:58

标签: c# asp.net-mvc templates mvc-editor-templates editorformodel

我试图弄清楚为什么我的模板没有被渲染或找到(因为模板上的断点未被击中)。我有这样的模型:

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">
}

Dropdown对象定义为

public class Dropdown
{
    public int SelectedValue { get; set; }

    public IEnumerable<SelectListItem> Values { get; set; }

    public string Placeholder { get; set; }
}

我已在Views / Shared / EditorTemplates / Dropdown.cshtml下为Dropdown创建了一个编辑器模板

@model Mvc.ViewModels.Dropdown

@Html.DropDownListFor(model => model.SelectedValue, Model.Values, Model.Placeholder)

令我震惊的是,我在该路径下也有DateTime.cshtml模板,工作正常。

正在渲染除Dropdown类型之外的模型上的每个属性,甚至是具有自定义模板的DateTime属性。

我不知道某事吗?

编辑:已尝试在城市房产中使用[UIHint(&#34; Dropdown&#34;)]。

EDIT2:尝试重命名为DropdownViewModel

1 个答案:

答案 0 :(得分:2)

默认情况下,模板不会递归到嵌套的复杂对象中。如果您希望这种情况发生,您可以通过创建具有以下内容的~/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>
        }
    }
}

您可以在this blog post中阅读有关ASP.NET MVC中默认模板的更多信息。