94 votes

Vue imbriquée foreach du modèle MVC Razor

Imaginez un scénario courant, ceci est une version plus simple de ce sur quoi je tombe. J'ai en réalité plusieurs niveaux d'imbrication supplémentaires dans le mien....

Mais voici le scénario

Thème contient une liste Catégorie contient une liste Produit contient une liste

Mon contrôleur fournit un thème entièrement peuplé, avec toutes les catégories pour ce thème, les produits dans ces catégories et leurs commandes.

La collection de commandes a une propriété appelée Quantité (parmi tant d'autres) qui doit être modifiable.

@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 j'utilise lambda au lieu de cela, je semble seulement obtenir une référence à l'objet Model principal, "Theme" et non à ceux dans la boucle foreach.

Est-ce que ce que j'essaie de faire est même possible ou ai-je surestimé ou mal compris ce qui est possible?

Avec ce qui précède, j'obtiens une erreur sur le TextboxFor, EditorFor, etc

CS0411: Les arguments de type pour la méthode 'System.Web.Mvc.Html.InputExtensions.TextBoxFor(System.Web.Mvc.HtmlHelper, System.Linq.Expressions.Expression>)' ne peuvent pas être déduits de l'utilisation. Essayez de spécifier explicitement les arguments de type.

Merci.

1 votes

Ne devriez-vous pas avoir @ avant tous les foreach? Ne devriez-vous pas également avoir des lambdas dans Html.EditorFor (Html.EditorFor(m => m.Note), par exemple) et le reste des méthodes? Je peux me tromper, mais pouvez-vous s'il vous plaît coller votre code réel? Je suis assez nouveau dans MVC, mais vous pouvez le résoudre assez facilement avec des vues partielles, ou des éditeurs (si c'est le nom?).

0 votes

category.nom Je suis sûr que c'est une chaîne de caractères et ...For ne prend pas en charge une chaîne de caractères en tant que premier paramètre

0 votes

Oui, j'ai juste manqué les @, maintenant ajoutés. Merci. Cependant, en ce qui concerne lambda, si je commence à taper @Html.TextBoxFor(m => m. alors je ne semble obtenir qu'une référence à l'objet Model principal, pas ceux à l'intérieur de la boucle foreach.

0voto

Manas Points 1632

Il est clair de l'erreur.

Les HtmlHelpers ajoutés avec "For" attendent une expression lambda comme paramètre.

Si vous passez la valeur directement, il vaut mieux utiliser la version normale.

par exemple

Au lieu de TextboxFor(....) utilisez Textbox()

La syntaxe pour TextboxFor sera comme Html.TextBoxFor(m=>m.Property)

Dans votre scénario, vous pouvez utiliser une boucle for de base, car elle vous donnera un index à utiliser.

@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)
      }
   }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X