ASP.NET MVC 不是 finding/using 自定义类型编辑器模板
ASP.NET MVC not finding/using custom type editor template
我一直在试图弄清楚为什么我的模板没有被渲染或找到(因为模板上的断点没有被击中)。我有这样的模型:
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
下为下拉菜单创建了一个编辑器模板
@model Mvc.ViewModels.Dropdown
@Html.DropDownListFor(model => model.SelectedValue, Model.Values, Model.Placeholder)
令我震惊的是,我在那个路径下也有 DateTime.cshtml 模板,它工作得很好。
除了 Dropdown 类型之外,模型上的每个 属性 都被渲染,甚至是带有自定义模板的 DateTime 类型。
难道我不知道什么吗?
编辑: 已在城市 属性.
尝试使用 [UIHint("Dropdown")]
EDIT2: 尝试重命名为 DropdownViewModel
默认情况下,模板不会递归到嵌套的复杂对象中。如果您希望发生这种情况,您始终可以通过创建具有以下内容的 ~/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 中阅读更多关于默认模板的信息。
我一直在试图弄清楚为什么我的模板没有被渲染或找到(因为模板上的断点没有被击中)。我有这样的模型:
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
下为下拉菜单创建了一个编辑器模板@model Mvc.ViewModels.Dropdown
@Html.DropDownListFor(model => model.SelectedValue, Model.Values, Model.Placeholder)
令我震惊的是,我在那个路径下也有 DateTime.cshtml 模板,它工作得很好。
除了 Dropdown 类型之外,模型上的每个 属性 都被渲染,甚至是带有自定义模板的 DateTime 类型。
难道我不知道什么吗?
编辑: 已在城市 属性.
尝试使用 [UIHint("Dropdown")]EDIT2: 尝试重命名为 DropdownViewModel
默认情况下,模板不会递归到嵌套的复杂对象中。如果您希望发生这种情况,您始终可以通过创建具有以下内容的 ~/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 中阅读更多关于默认模板的信息。