2011-04-28 61 views
20

我有什么似乎(我反正)是一个奇怪的问题......问题的MVC EditorFor命名模板

我创建了一个SelectListItem一个简单的编辑模板(SelectListItem.cshtml在〜/查看/共享/ EditorTemplates文件夹),例如:

<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 

我不明白为什么默认模板作品和指定的模板不会。任何帮助,将不胜感激。

谢谢。

回答

29

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

在第二种情况下,通过明确设置你的EditorFor使用特定的编辑模板CategoryIcons,你告诉它使用的是编辑模板的整个枚举,而不是允许枚举被缺省的模板,在对每个枚举项目使用模板。

我不确定最好的解决方法。

一种方法是定义一个CategoryIcons模板,其模型是IEnumerable<CategoryIcon>一个实例,它只是foreaches的Model枚举,并且对每个项目进行Html.EditorFor,具有CategoryIcon明确模板参考。然后,您将每个项目编辑器模板放在该模板中(CategoryIcon而不是CategoryIcons)。然后你会通过做@Html.EditorFor(c => c.Categories, "CategoryIcons")来调用它。

我将查看是否有更好的方法来完成此操作,但我希望现在可能有用。如果可以对模板进行参数化,那就太棒了,因此您可以编写一个IEnumerable模板,该模板将每个项目使用的模板名称作为参数。

+2

我写的是完全相同的响应,我将补充的唯一的另一件事是您可以用任何其他名称的类包装'SelectListItem'并使用它来获取不同的模板,但无论在哪种情况下,这可能对于希望添加到MVCContrib中的人来说,这是一个好地方。 – 2011-04-28 12:24:14

+1

感谢您的解释和建议。我通过从SelectListItem继承创建了一个新类,然后为该类创建了一个新模板 - 它完美地工作,但似乎是不必要的开销。 – Neilski 2011-04-28 17:55:28

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> 

还不干净,但我喜欢它不是继承像一个新的类更好你最终做了。

+0

感谢Ben,我认为这个解决方案更容易 - 尤其是如果您只处理模型的一个实例。这不是我的情况,我觉得在我的特定应用程序中创建一个新类实际上允许我为数据添加一些额外的方法和属性。一个'当然马'的情况下,我想 - 谢谢你的帖子 - 非常感谢。 – Neilski 2011-08-13 15:38:28

1

(很抱歉,如果我的C#语法是有点过,我在vb.net写)如果你使用EditorFor,我不认为循环的解决方案会奏效。似乎使用IEnumerable模板是表单输入正确命名的唯一方法;如果您只是多次致电EditorFor,那么表单<INPUT>将具有相同的ID,而不是索引ID。

我遇到过这个问题,solution是通过列表项发出可枚举模板和而不是循环。

对不起,这不是一个评论 - 没有评论权限。