MVC EditorFor问题命名模板

Nei*_*ski 21 editortemplates razor asp.net-mvc-3

我有什么看起来(对我来说)是一个奇怪的问题......

我为SelectListItem创建了一个简单的编辑器模板(〜/ Views/Shared/EditorTemplates文件夹中的SelectListItem.cshtml),例如:

<ul class="select-list-item cell-15 col-3 omega clearfix">
    @Html.EditorFor(c => c.Categories)
</ul>
Run Code Online (Sandbox Code Playgroud)

其中c.Categories是IEnumerable

这工作正常,但我想要另一个模板来呈现具有略微不同标记的集合,因此我将编辑器模板复制并重命名为,例如,"CategoryIcons.cshtm"并调用如下:

<ul class="select-list-item cell-15 col-3 omega clearfix">
    @Html.EditorFor(c => c.Categories, "CategoryIcons")
</ul>
Run Code Online (Sandbox Code Playgroud)

简而言之,唯一的区别是我正在指定一个命名的编辑器模板.

当我打开页面时,我现在收到以下错误:

传递到字典中的模型项的类型为'System.Collections.Generic.List`1 [System.Web.Mvc.SelectListItem]',但此字典需要类型为'System.Web.Mvc.SelectListItem'的模型项

两个模板ID中的模板模型声明:

@model System.Web.Mvc.SelectListItem
Run Code Online (Sandbox Code Playgroud)

我不明白为什么默认模板工作而命名模板不工作.任何帮助,将不胜感激.

谢谢.

Pau*_*aft 29

当你调用@Html.EditorFor(c => c.Categories)它时,它会回退到IEnumerable的默认模板.此默认模板由MVC框架提供,其行为是为Html.EditorFor()枚举中的每个项目输出.这反过来又为列表中的每个项目单独发出相应的编辑器模板 - 在您的情况下,它们都是实例SelectListItem,因此在第一种情况下,SelectListItem模板用于每个项目.

在第二种情况下,通过显式设置您EditorFor使用特定的编辑器模板CategoryIcons,您告诉它使用该编辑器模板进行整个枚举,而不是默认情况下允许枚举,然后使用每个枚举项的模板.

我还不确定这方面的最佳方法.

一种方法是定义一个CategoryIcons模板,其模型是一个实例IEnumerable<CategoryIcon>,它只是简化Model枚举,并Html.EditorFor为每个项目执行,并使用显式模板引用CategoryIcon.然后,将每个项目的编辑器模板放在该模板中(CategoryIcon不是CategoryIcons).然后你会这样做@Html.EditorFor(c => c.Categories, "CategoryIcons").

我要去看看是否有更好的方法来完成这项工作,但我希望现在这可能有用.如果模板可以参数化会很棒,所以你可以编写一个IEnumerable模板,该模板将用作每个项目的模板名称作为参数.

  • 我正在编写完全相同的响应,我将添加的唯一另一件事是你可以用一个任何其他名称的类包装`SelectListItem`并使用它来获得一个不同的模板,但在任何一种情况下,这可能是个好地方对于想要添加到MVCContrib的人来说. (2认同)

Ben*_*kel 5

只是一个更新,我偶然发现了这个问题,试图自己解决同样的问题.

我最终做的是迭代集合的每个实例并单独调用EdtorFor,有点像这样:

<ul class="select-list-item cell-15 col-3 omega clearfix">
    @for (int i=0;i<Model.Categories.Count;i++) {
        @Html.EditorFor(c => c.Categories[i], "CategoryIcons")
    }
</ul>
Run Code Online (Sandbox Code Playgroud)

仍然不干净,但我喜欢它比继续像你最终做的新类更好.

(对不起,如果我的C#语法有点偏,我在vb.net上写)