Foreach in einer Foreach-in MVC-Ansicht
BIG EDIT : ich habe bearbeitet meine gesamte post mit der Antwort, dass ich kam mit der Hilfe Von V und Johannes, EIN GROßES DANKE JUNGS !!!!
Ich versucht habe zu tun, eine foreach-Schleifen innerhalb einer foreach-Schleife in meine index-Ansicht, um die Anzeige meiner Produkte in einem accordion. Lassen Sie mich Ihnen zeigen, wie ich versuche, dies zu tun.
Hier sind meine Modelle :
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; }
}
Es ist ein eine eines-viele-Beziehung, Ein Produkt hat nur eine Kategorie, sondern eine Kategorie viele Produkte.
Hier ist, was ich versuche zu tun, aus meiner Sicht :
@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>
Ich bin mir nicht ganz sicher, ob dies der richtige Weg, es zu tun, aber das ist ziemlich viel, was ich versuche zu tun. Foreach Kategorien, alle Produkte von Kategorien, die innerhalb eines Akkordeon-tab.
- Kategorie 1
- Produkt 1
- Produkt 3
- Kategorie 2
- Produkt 2
- Produkt 4
- Kategorie 3
- Produkt 5
Hier will ich hinzufügen, mein mapping für meine one-man ein-vielen (Dank Brian P) Beziehung :
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>();
}
}
Ich auch meine controller so dass Sie sehen können, wie ich es gemacht habe :
public ActionResult Index()
{
ViewBag.Categories = db.Category.OrderBy(c => c.Name).ToList();
return View(db.Product.Include(c => c.Category).ToList());
}
BIG EDIT : ich habe bearbeitet meine gesamte post mit der Antwort, dass ich kam mit der Hilfe Von V und Johannes, EIN GROßES DANKE JUNGS !!!!
- Wenn es ein eins-zu-eins-Beziehung, warum haben Sie eine ICollection<Kategorie> in der Product-Klasse? Was macht der controller-Aktion Aussehen? Was ist das Modell an die view?
- Der Grund, ich habe eine ICollection<Kategorie> weil manchmal ich brauche, um die CatogoryID oder den Namen dieses Modells. Wie hier, möchte ich die Anzeige der Kategorie, name auf meinem Akkordeon <h3>. Bin ich nicht richtig ?
- Ihre Beziehung ist NICHT 1-1 ist es viele-1, Sie sind einfach nur zu denken über Sie nach hinten. 1 Kategorie viele Produkte hat.
- Ich glaube, Sie haben Recht... ich dachte über ihn nach hinten. Jetzt würde es Sinn machen, warum bin ich nicht in der Lage, es
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt dein controller die action-Methode ist so etwas wie dieses:
Ändern Ihre Modelle, um so etwas wie dieses:
Dann Ihre da nun der controller nimmt in einer Kategorie als Modell (statt eines Produkts):
AKTUALISIERT: Hinzufügen von ToList() in der controller-return-Anweisung.
Haben Sie:
dann
Basierend auf dieser Sicht und Modell es scheint, dass
Model
ist der TypProduct
wenn ja, dann ist das zweiteforeach
ist nicht gültig. Der erste könnte sein, die ist ungültig, wenn Sie wieder eine Sammlung vonProduct
.UPDATE:
Ich bin überrascht, dass Ihr code wird kompiliert, wenn Sie sagte, das Sie wieder ein Modell von
Product
geben. Hier ist, wie Sie es tun können:Vorschlagen, dass anstatt eines
Product
Sie erneut eine Sammlung vonCategory
mit Produkten. So etwas in EF:Versuchen Sie dies:
Es sieht aus wie Sie Schleife für jedes Produkt, jedes mal, das ist jetzt Schleife für jedes Produkt, das die gleiche Kategorie-ID der aktuellen Kategorie wird geloopt
Controller
Ansicht
ein filter für das Modell mit der angegebenen Kategorie
wie :=> Modell.wo(p=>p.CategoryID == Kategorie.CategoryID)
versuchen, diese...