MVC Razor vista anidada foreach's modelo

Imagina un escenario común, esta es una versión más simple de lo que me estoy encontrando. En realidad tengo un par de capas de anidación más en la mía....

Pero este es el escenario

Tema contiene Lista<Categoría< Categoría contiene Lista Producto contiene Lista

Mi Controlador proporciona un Tema completamente poblado, con todas las Categorías para ese tema, los Productos dentro de estas categorías y sus pedidos.

La colección de pedidos tiene una propiedad llamada Cantidad (entre muchas otras) que necesita ser editable.

@model ViewModels.MyViewModels.Theme

@Html.LabelFor(Model.Theme.name)
@foreach (var category in Model.Theme)
{
   @Html.LabelFor(category.name)
   @foreach(var product in theme.Products)
   {
      @Html.LabelFor(product.name)
      @foreach(var order in product.Orders)
      {
          @Html.TextBoxFor(order.Quantity)
          @Html.TextAreaFor(order.Note)
          @Html.EditorFor(order.DateRequestedDeliveryFor)
      }
   }
}

Si utilizo lambda en su lugar, entonces sólo parece obtener una referencia al objeto Modelo superior, "Tema" no a los que están dentro del bucle foreach.

¿Es posible lo que estoy tratando de hacer o he sobreestimado o malinterpretado lo que es posible?

Con lo anterior me sale un error en el TextboxFor, EditorFor, etc

CS0411: Los argumentos de tipo para el método TextBoxFor<TModel,TProperty>(System.Web.Mvc.HtmlHelper, System.Linq.Expressions.Expression<System.Func<TModel,TProperty>>)'

no se puede deducir del uso. Pruebe a especificar los argumentos de tipo explícitamente.

Gracias.

Puedes utilizar EditorTemplates para hacerlo, necesitas crear un directorio llamado "EditorTemplates" en la carpeta de vistas de tu controlador'y colocar una vista separada para cada una de tus entidades anidadas (nombradas como nombre de clase de entidad)

Vista principal:

@model ViewModels.MyViewModels.Theme

@Html.LabelFor(Model.Theme.name)
@Html.EditorFor(Model.Theme.Categories)

Vista de categoría (/MyController/EditorTemplates/Category.cshtml):

@model ViewModels.MyViewModels.Category

@Html.LabelFor(Model.Name)
@Html.EditorFor(Model.Products)

Vista de producto (/MyController/EditorTemplates/Product.cshtml):

@model ViewModels.MyViewModels.Product

@Html.LabelFor(Model.Name)
@Html.EditorFor(Model.Orders)

y así sucesivamente

de esta manera Html.EditorFor helper generará los nombres de los elementos de una manera ordenada y por lo tanto usted no tendrá ningún problema para recuperar la entidad del tema publicado en su conjunto.

Comentarios (1)

Podría añadir un parcial de Categoría y un parcial de Producto, cada uno tomaría una parte más pequeña del modelo principal como modelo propio, es decir, el tipo de modelo de Categoría podría ser un IEnumerable

Comentarios (4)

Está claro por el error.

El HtmlHelpers anexado con "For" espera expresión lambda como parámetro.

Si usted está pasando el valor directamente, mejor utilizar Normal uno.

Ej.

En lugar de TextboxFor(....) use Textbox()

la sintaxis para TextboxFor será como Html.TextBoxFor(m=>m.Property)

En su caso puede utilizar el bucle for básico, ya que le dará el índice a utilizar.

@for(int i=0;im.Theme[i].name)
   @for(int j=0;jm.Theme[i].Products[j].name)
      @for(int k=0;kModel.Theme[i].Products[j].Orders[k].Quantity)
           @Html.TextAreaFor(m=>Model.Theme[i].Products[j].Orders[k].Note)
           @Html.EditorFor(m=>Model.Theme[i].Products[j].Orders[k].DateRequestedDeliveryFor)
      }
   }
}
Comentarios (0)