我(无论如何)出现了一个奇怪的问题......
我为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
我不明白为什么默认模板有效,命名模板没有。任何帮助将不胜感激。
感谢。
答案 0 :(得分: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模板,该模板将模板的名称作为参数用于每个项目。
答案 1 :(得分: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上写)
答案 2 :(得分:1)
如果你正在使用EditorFor,我认为循环解决方案不会起作用。似乎使用IEnumerable模板是表单输入正确命名的唯一方法;如果你只是反复调用EditorFor,那么你的表单<INPUT>
将具有相同的ID,而不是索引的ID。
我遇到了这个问题,solution发出了可枚举模板,不循环遍历列表项。
很抱歉让这个答案不是评论 - 没有评论权。