Escuché que tener @foreach dentro de una vista es un no-no. Es decir, la vista no debería tener ninguna lógica. ¿Cuál es la mejor práctica sobre dónde debería estar la lógica de @foreach?
@foreach..
Escuché que tener @foreach dentro de una vista es un no-no. Es decir, la vista no debería tener ninguna lógica. ¿Cuál es la mejor práctica sobre dónde debería estar la lógica de @foreach?
@foreach..
Respuestas:
¿Cuál es la mejor práctica sobre dónde debería estar la lógica de @foreach?
En ninguna parte, simplemente deshazte de él. Puede utilizar un editor o plantillas de visualización.
Así por ejemplo:
@foreach (var item in Model.Foos)
{
<div>@item.Bar</div>
}
perfectamente bien podría ser reemplazado por una plantilla de visualización:
@Html.DisplayFor(x => x.Foos)
y luego definirás la plantilla de visualización correspondiente (si no te gusta la predeterminada ). Por lo tanto, definiría una plantilla reutilizable ~/Views/Shared/DisplayTemplates/Foo.cshtml
que el marco procesará automáticamente para cada elemento de la colección Foos ( IEnumerable<Foo> Foos { get; set; }
):
@model Foo
<div>@Model.Bar</div>
Obviamente, se aplican exactamente las mismas convenciones para las plantillas de editor que deben usarse en caso de que desee mostrar algunos campos de entrada que le permitan editar el modelo de vista en contraste con mostrarlo como de solo lectura.
foreach
? Como mínimo, una plantilla de visualización (aunque es un enfoque perfectamente aceptable, independientemente) requiere que se renderice una nueva vista, que no es gratuita. La mayoría de las veces no afectará el tiempo de carga de su sitio de manera notable, pero si se hace lo suficiente, podría afectar el rendimiento. Un foreach
poco de HTML es y siempre será prácticamente instantáneo. Como dije, no es un gran problema de cualquier manera, pero en todo caso hay un argumento para usar foreach
.
Cuando las personas dicen que no pongan lógica en las vistas, generalmente se refieren a la lógica empresarial, no a la lógica de procesamiento. En mi humilde opinión, creo que usar @foreach en las vistas está perfectamente bien.
Estoy usando @foreach
cuando envío una entidad que contiene una lista de entidades (por ejemplo, para mostrar 2 cuadrículas en 1 vista)
Por ejemplo, si envío como modelo la entidad Foo que contiene Foo1(List<Foo1>)
yFoo2(List<Foo2>)
Puedo referirme a la primera Lista con:
@foreach (var item in Model.Foo.Foo1)
{
@Html.DisplayFor(modelItem=> item.fooName)
}
una respuesta a @DarinDimitrov para un caso en el que he usado foreach en una vista de navaja.
<li><label for="category">Category</label>
<select id="category">
<option value="0">All</option>
@foreach(Category c in Model.Categories)
{
<option title="@c.Description" value="@c.CategoryID">@c.Name</option>
}
</select>
</li>
Html.DropDownListFor
que simplemente tendrá en cuenta el título? Es trivial y no convierte sus puntos de vista en código espagueti: stackoverflow.com/a/7938038/29407
optgroup
elementos en la lista de selección, ya que no hay soporte para eso en HtmlHelpers. Si solo necesita agregar un elemento adicional a la lista de selección, hay mejores formas de lograrlo y luego seguir usando el asistente.
La respuesta no funcionará cuando se usa la sobrecarga para indicar la plantilla @Html.DisplayFor(x => x.Foos, "YourTemplateName)
.
Parece estar diseñado de esa manera, vea este caso . Además, la excepción que da el marco (sobre el tipo que no ha sido el esperado) es bastante engañosa y me engañó en el primer intento (gracias @CodeCaster)
En este caso tienes que usar@foreach
@foreach (var item in Model.Foos)
{
@Html.DisplayFor(x => item, "FooTemplate")
}
IEnumerable<T>
y llamará a la plantilla para el tipo T
de cada elemento.