asp.net mvc - places - Usar DisplayTemplate(con DisplayFor) para cada elemento en una colección
html editorfor decimal places (2)
Creé un DisplayTemplate para una clase Comment
y lo coloqué dentro de Comment/DisplayTemplates/Comment.cshtml
.
Comment.cshtml
está escrito correctamente:
@model Comment
Luego, tengo una vista parcial que toma un IEnumerable<Comment>
para el modelo. Allí recorro la colección y me gustaría usar DisplayTemplate para la clase Comment
. La vista, en su integridad:
@model IEnumerable<Comment>
@foreach (var comment in Model.Where(c => c.Parent == null)) {
@Html.DisplayFor(model => comment)
}
Sin embargo, Html.DisplayFor
un error en la línea Html.DisplayFor
:
El elemento de modelo que se pasa al diccionario es del tipo ''System.Int32'', pero este diccionario requiere un elemento de modelo de tipo ''System.String''.
¿Cómo puedo invocar DisplayTemplate para cada elemento en el ciclo foreach
?
En lugar de tener una vista que toma un IEnumerable<Comment>
y que todo lo que hace es recorrer la colección y llamar a la plantilla de visualización correcta simplemente:
@Html.DisplayFor(x => x.Comments)
donde la propiedad Comentarios es un IEnumerable<Comment>
que hará automáticamente el bucle y renderizará la plantilla de visualización Comment.cshtml
para cada elemento de esta colección.
O si realmente necesita una vista así (no sé por qué) simplemente podría:
@model IEnumerable<Comment>
@Html.DisplayForModel()
En cuanto a la cláusula Where
que está utilizando allí, simplemente debe eliminarla y delegar esta tarea al controlador. Es responsabilidad del controlador preparar el modelo de vista, no la vista que realiza tales tareas.
Si bien la respuesta aceptada funciona bien la mayor parte del tiempo, hay otros casos en los que debemos tener en cuenta el índice del elemento cuando se procesa (es decir, agregar un javascript personalizado que genere referencias a cada elemento en función de su índice).
En ese caso, DisplayFor todavía se puede usar en el ciclo de esta manera:
@model IEnumerable<Comment>
@for (int index = 0; index < Model.Count(); index++)
{
@Html.DisplayFor(model => model[index])
}