我有(无论如何对我来说)似乎是一个奇怪的问题...
我为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>
简而言之,唯一的区别是我指定了一个命名的编辑器模板。
当我打开页面时,现在出现以下错误:
The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[System.Web.Mvc.SelectListItem]', but this dictionary requires a model item of type 'System.Web.Mvc.SelectListItem'
模板的模型声明,在两个模板id中:
@model System.Web.Mvc.SelectListItem
我不明白为什么默认模板有效,而命名模板无效。任何帮助,将不胜感激。
谢谢。
最佳答案
当您调用@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模板,该模板将要用于其每个项目的模板名称作为参数。
关于asp.net-mvc-3 - MVC编辑器问题对于命名模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5818351/