Foreach dans un Foreach dans MVC Vue
BIG EDIT : j'ai édité mon post avec la réponse que j'ai trouvé avec l'aide de Von V et Johannes, UN GRAND MERCI à VOUS les GARS !!!!
J'ai essayé de faire une boucle foreach, à l'intérieur d'une boucle foreach dans mon index pour afficher mes produits dans un accordéon. Permettez-moi de vous montrer comment je suis en train de le faire.
Voici mes modèles :
public class Product
{
[Key]
public int ID { get; set; }
public int CategoryID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public string Path { get; set; }
public virtual Category Category { get; set; }
}
public class Category
{
[Key]
public int CategoryID { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
C'est un un seul une relation, Un produit a une seule catégorie, mais une catégorie a de nombreux produits.
Voici ce que j'essaie de faire de mon point de vue :
@model IEnumerable<MyPersonalProject.Models.Product>
<div id="accordion1" style="text-align:justify">
@foreach (var category in ViewBag.Categories)
{
<h3><u>@category.Name</u></h3>
<div>
@foreach (var product in Model)
{
if (product.CategoryID == category.CategoryID)
{
<table cellpadding="5" cellspacing"5" style="border:1px solid black; width:100%;background-color:White;">
<thead>
<tr>
<th style="background-color:black; color:white;">
@product.Title
@if (System.Web.Security.UrlAuthorizationModule.CheckUrlAccessForPrincipal("/admin", User, "GET"))
{
@Html.Raw(" - ")
@Html.ActionLink("Edit", "Edit", new { id = product.ID }, new { style = "background-color:black; color:white !important;" })
}
</th>
</tr>
</thead>
<tbody>
<tr>
<td style="background-color:White;">
@product.Description
</td>
</tr>
</tbody>
</table>
}
}
</div>
}
</div>
Je ne suis pas tout à fait sûr que ce est la bonne façon de le faire, mais c'est à peu près ce que je suis en train de faire. Foreach catégories, mettre tous les produits de cette catégories à l'intérieur d'un accordéon onglet.
- catégorie 1
- produit 1
- produit 3
- de catégorie 2
- produit 2
- produit 4
- catégorie 3
- produit 5
Ici, je vais ajouter ma cartographie de ma un grand nombre (Merci Brian P) la relation :
public class MyPersonalProjectContext : DbContext
{
public DbSet<Product> Product { get; set; }
public DbSet<Category> Category { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Product>();
modelBuilder.Entity<Category>();
}
}
Je vais aussi ajouter mon contrôleur de sorte que vous pouvez voir comment j'ai fait :
public ActionResult Index()
{
ViewBag.Categories = db.Category.OrderBy(c => c.Name).ToList();
return View(db.Product.Include(c => c.Category).ToList());
}
BIG EDIT : j'ai édité mon post avec la réponse que j'ai trouvé avec l'aide de Von V et Johannes, UN GRAND MERCI à VOUS les GARS !!!!
La raison pour laquelle j'ai une ICollection<Catégorie> est parce que parfois, j'ai besoin d'obtenir le CatogoryID ou le Nom de ce Modèle. Comme ici, je veux afficher le nom de la catégorie sur mon accordéon <h3>. Ne suis-je pas en train de faire ?
Votre relation n'est PAS de 1-1, c'est plusieurs-1, vous avez juste à penser à l'envers. 1 catégorie a de nombreux produits.
Je pense que vous avez raison... je si à ce sujet à l'envers. Maintenant, il serait logique que la raison pour laquelle je ne suis pas capable de ça
OriginalL'auteur Guillaume Longtin | 2013-04-12
Vous devez vous connecter pour publier un commentaire.
En supposant que votre contrôleur de la méthode d'action est quelque chose comme ceci:
Modifier vos modèles pour être quelque chose comme ceci:
Alors votre depuis maintenant le contrôleur prend dans une Catégorie comme Modèle (au lieu d'un Produit):
Mise à JOUR: Ajouter ToList() pour le contrôleur de l'instruction return.
Toute réflexion sur ma cartographie?
votre cartographie semble en arrière pour moi, puisque c'est une catégorie peut avoir de nombreux produits et chaque produit peut avoir seulement 1 catégorie. J'aimerais des conseils pour corriger votre cartographie. Pourquoi êtes-vous créer un mappage personnalisé au lieu d'utiliser la valeur par défaut EF de la cartographie?
Pensée que j'ai eu à le préciser. Si l'on peut de cette façon j'ai l'habitude de le modifier pour mes connaissances personnelles. Mais mon problème ATM est quand j'essaie d'appeler ma première boucle foreach, il dit toujours que je ne peux pas le faire depuis le Modèle.La catégorie n'a pas obtenir de l'agent recenseur.
Si vous suivez mon exemple - qui ne devrait pas nécessiter un mappage personnalisé, Catégorie agit d'un seul objet (n'est pas une collection) comme une propriété ou d'un Produit. Rappelez-vous que le contrôleur de l'action renvoie une collection de la Catégorie (pas de Produit).
OriginalL'auteur Johannes Setiabudi
Vous avez:
et puis
Basé sur ce modèle et de la vue, il semble que
Model
est de typeProduct
si oui, alors la deuxièmeforeach
n'est pas valide. Fait le premier pourrait bien être la seule qui n'est pas valide si vous retournez une collection deProduct
.Mise à JOUR:
Je suis surpris de votre code compile quand vous avez dit que vous êtes de retour à un modèle de
Product
type. Voici comment vous pouvez le faire:Qui suggèrent qu'au lieu de retourner un
Product
, vous retourner une collection deCategory
avec des Produits. Quelque chose comme ceci dans l'EF:Voir mise à jour de réponse
Bon je vais faire quelque chose comme votre réponse. Permettez-moi de revenir sur ce point.
La seule chose qui ne fonctionne pas pour moi, c'est mon mapping, pas sûr que c'est bien fait. Sinon avec la façon dont vous le faites, il va fonctionner.
Je vous remercie pour votre aide, j'ai fait en quelque sorte. Édité mon post avec ma solution, qu'en pensez-vous?
OriginalL'auteur von v.
Essayez ceci:
Il semble que vous êtes en boucle pour chaque produit à chaque fois, maintenant, c'est une boucle pour chaque produit qui a le même ID de la catégorie de la catégorie actuelle bouclée
OriginalL'auteur CR41G14
Contrôleur
Vue
vous avez besoin de filtrer le modèle avec la catégorie donnée
comme :=> le Modèle.où(p=>p.CategoryID == catégorie.CategoryID)
...
OriginalL'auteur Ad Kahn