我试图弄清楚为什么我的模板没有被渲染或找到(因为模板上的断点未被击中)。我有这样的模型:
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
答案 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中默认模板的更多信息。