Using a DisplayTemplate (with DisplayFor) for each item in a collection

asp.net-mvc, asp.net-mvc-3, display-templates, razor

Solution

Instead of having a view that take an `IEnumerable<Comment>` and that all it does is loop through the collection and call the proper display template simply:

@Html.DisplayFor(x => x.Comments)

where the Comments property is an `IEnumerable<Comment>` which will automatically do the looping and render the `Comment.cshtml` display template for each item of this collection.

Or if you really need such a view (don't know why) you could simply:

@model IEnumerable<Comment>
@Html.DisplayForModel()

As far as the `Where` clause you are using in there you should simply remove it and delegate this task to the controller. It's the controller's responsibility to prepare the view model, not the view performing such tasks.

Problem

I have created a DisplayTemplate for a `Comment` class, and placed it inside `Comment/DisplayTemplates/Comment.cshtml`. `Comment.cshtml` is properly typed: ``` @model Comment ``` Then, I have a partial view that takes an `IEnumerable<Comment>` for model. In there I loop through the collection and would like to use the DisplayTemplate for the `Comment` class. The view, in its integrity: ``` @model IEnumerable<Comment> @foreach (var comment in Model.Where(c => c.Parent == null)) { @Html.DisplayFor(model => comment) } ``` However, I get an error on the `Html.DisplayFor` line: The model item passed into the dictionary is of type 'System.Int32', but this dictionary requires a model item of type 'System.String'. How can I invoke the DisplayTemplate for each item in the `foreach` loop?

Original source

Related problems