【问题标题】:ASP.NET MVC not finding/using custom type editor templateASP.NET MVC 未找到/使用自定义类型编辑器模板
【发布时间】:2016-06-10 08:09:58
【问题描述】:

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

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 属性。

我不知道什么吗?

编辑:已尝试在 Cities 属性中使用 [UIHint("Dropdown")]。

EDIT2:尝试重命名为 DropdownViewModel

【问题讨论】:

  • 不相关,但只需要@Html.DropDownListFor(m =&gt; m.SelectedValue, Model.Values, Model.Placeholder) - 无需从第一个创建第二个相同的IEnumerable&lt;SelectListItem&gt;
  • @StephenMuecke 谢谢,感谢每一个快捷方式:)
  • @NightOwl888 已经尝试使用 UIHint 强制使用没有结果的模板
  • 尝试更改您的班级名称。 Dropdown 可能是一个保留字,因为在 MVC 框架中已经有一个名为 Dropdown 的类。

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


【解决方案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>
        }
    }
}

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

【讨论】:

  • 就像一个魅力,不知道它默认不支持嵌套的复杂对象。
  • 不相关的注释,因为我的示例启用了 ValidationSummary,所以最好使用 @Html.ValidationMessage(prop.PropertyName) 而不是添加第二个“*”参数来让数据注释正常工作跨度>
  • 嗨达林,SimpleDisplayText 尚未添加到 .Net Core 2!你能更新你的答案吗?
  • 还有 ToHtmlString。
猜你喜欢
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多