MVC EditorFor问题命名模板

时间:2011-04-28 12:08:06

标签: asp.net-mvc-3 razor editortemplates

我(无论如何)出现了一个奇怪的问题......

我为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

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

感谢。

3 个答案:

答案 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发出了可枚举模板,循环遍历列表项。

很抱歉让这个答案不是评论 - 没有评论权。