tag net for asp asp.net-mvc razor

asp.net-mvc - for - tag helper asp net core 2



MVC Razor @foreach (5)

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 debe estar la lógica de @foreach?

@foreach..


¿Cuál es la mejor práctica sobre dónde debe estar la lógica de @foreach?

En ninguna parte, solo deshazte de eso. Puede usar editor o mostrar plantillas.

Así por ejemplo:

@foreach (var item in Model.Foos) { <div>@item.Bar</div> }

podría perfectamente ser reemplazado por una plantilla de visualización:

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

y luego definirá la plantilla de visualización correspondiente (si no le gusta la plantilla predeterminada ). Así definiría una plantilla reutilizable ~/Views/Shared/DisplayTemplates/Foo.cshtml que será renderizada automáticamente por el framework para cada elemento de la colección Foos ( IEnumerable<Foo> Foos { get; set; } ):

@model Foo <div>@Model.Bar</div>

Obviamente, exactamente las mismas convenciones se aplican a las plantillas de editor que se deben usar en caso de que quiera mostrar algunos campos de entrada que le permiten editar el modelo de vista en contraste con solo mostrarlo como de solo lectura.


Cuando las personas dicen que no ponen la lógica en las vistas, generalmente se refieren a la lógica comercial, no a la lógica de representación. En mi humilde opinión, creo que usar @foreach en 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 estoy enviando como modelo a la entidad Foo que contiene Foo1(List<Foo1>) y Foo2(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 donde he usado foreach en una vista de afeitar.

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


La respuesta no funcionará al usar la sobrecarga para indicar la plantilla @Html.DisplayFor(x => x.Foos, "YourTemplateName) .

Parece estar diseñado de esa manera, mira este caso . También 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, debes usar @foreach

@foreach (var item in Model.Foos) { @Html.DisplayFor(x => item, "FooTemplate") }