21

我有什么似乎(无论如何对我来说)是一个奇怪的问题......

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

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

其中 c.Categories 是一个 IEnumerable

这工作得很好,但我想要另一个模板来呈现带有稍微不同标记的集合,所以我复制并重命名了编辑器模板,例如,“CategoryIcons.cshtm”并调用如下:

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

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

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

传入字典的模型项的类型为“System.Collections.Generic.List`1[System.Web.Mvc.SelectListItem]”,但此字典需要“System.Web.Mvc.SelectListItem”类型的模型项

模板的模型声明,在两个模板 id 中:

@model System.Web.Mvc.SelectListItem

我不明白为什么默认模板有效而命名模板无效。任何帮助,将不胜感激。

谢谢。

4

3 回答 3

29

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

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

我还不确定解决这个问题的最佳方法。

一种方法是定义一个CategoryIcons模板,它的模型是 的一个实例IEnumerable<CategoryIcon>,它简单地 foreachesModel枚举,并Html.EditorFor为每个项目执行,具有显式的模板引用CategoryIcon。然后,您将每个项目的编辑器模板放入该模板(CategoryIconnot CategoryIcons)。然后你会通过做来调用它@Html.EditorFor(c => c.Categories, "CategoryIcons")

我将环顾四周,看看是否有更好的方法来完成这项工作,但我希望这对现在有用。如果模板可以被参数化,那就太好了,因此您可以编写一个 IEnumerable 模板,该模板将模板的名称作为参数用于每个项目。

于 2011-04-28T12:20:41.817 回答
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>

仍然不干净,但我更喜欢它而不是像你最终那样继承一个新类。

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

于 2011-08-11T16:13:06.487 回答
1

If you're using EditorFor, I don't think the looping solution will work. It seems that using the IEnumerable template is the only way for the form inputs to be named correctly; if you just call EditorFor repeatedly, then your form <INPUT>s will have the same ID, rather than indexed IDs.

I experienced this issue and the solution was to emit the enumerable template and not loop through the list items.

Sorry to make this an answer not a comment -- don't have commenting rights.

于 2011-08-31T18:59:47.690 回答