2016-10-15 1 views
2

Hallo Ich bin ein Anfänger und ich arbeite mit ASP.NET mit MVC5.Wie kann ich C# foreach mit verschachtelten Untertiteln machen?

Ich mag eine IEnumerable <> Lebensmittel-Menü-Preisliste mit verschachtelten Titeln (Kurse) in 1 foreach machen, so kann ich eine neue Saite (course) mit den CRUD-Operationen I mit Entity vorgenommen erstellen oder bearbeiten Rahmen.

Ich werde einbetten ein Bild in den unten stehenden Link die ich halb/hartkodierte gemacht und wie Sie hartcodiert im Code unten die Titel sehen können.

Vorschau des Ergebnisses möchte ich erreichen: preview of result I want to reach

Ich habe 2 Modelle:

  1. Course.cs = der Titel mit Objekt string: course
  2. Dish.cs = und die Liste mit der Eigenschaftszeichenfolge: DishName

Gibt es eine Möglichkeit, diese Tabelle in 1 foreach auf diese Weise zu setzen, dass ich auch den Titel mit den CRUD-Operationen mit dem Modell bearbeiten kann, das ich definiert habe?

Ich habe schon viel versucht, das zu erreichen. Wie dem auch sei dies auf Stackoverflow meine erste Frage war ..

@model IEnumerable<Project_Lameau.Models.Dish> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Suggestie</h2> 

<table class="table"> 
    @foreach (var item in Model.Where(d => d.CourseName.Contains("Suggestie"))) 
    { 
     <tr> 
      <td>@item.DishName</td> 
      <td class="text-right">@item.Price</td> 
     </tr> 
    } 
</table> 
<hr /> 


<h2>Salade</h2> 

<table class="table"> 
    @foreach (var item in Model.Where(d => d.CourseName.Contains("Salade"))) 
    { 
     <tr> 
      <td>@item.DishName</td> 
      <td class="text-right">@item.Price</td> 
     </tr> 
    } 
</table> 
<hr /> 


<h2>Voorgerecht</h2> 

<table class="table"> 
    @foreach (var item in Model.Where(d => d.CourseName.Contains("Voorgerecht"))) 
    { 
     <tr> 
      <td>@item.DishName</td> 
      <td class="text-right">@item.Price</td> 
     </tr> 
    } 
</table> 
<hr /> 


<h2>Hoofd Vlees</h2> 

<table class="table"> 
    @foreach (var item in Model.Where(d => d.CourseName.Contains("Hoofd Vlees"))) 
    { 
     <tr> 
      <td>@item.DishName</td> 
      <td class="text-right">@item.Price</td> 
     </tr> 
    } 
</table> 
<hr /> 


<h2>Hoofd Vis</h2> 

<table class="table"> 
    @foreach (var item in Model.Where(d => d.CourseName.Contains("Hoofd Vis"))) 
    { 
     <tr> 
      <td>@item.DishName</td> 
      <td class="text-right">@item.Price</td> 
     </tr> 
    } 
</table> 
<hr /> 


<h2>Vega</h2> 

<table class="table"> 
    @foreach (var item in Model.Where(d => d.CourseName.Contains("Vega"))) 
    { 
     <tr> 
      <td>@item.DishName</td> 
      <td class="text-right">@item.Price</td> 
     </tr> 
    } 
</table> 
+0

Wie sieht die Klasse 'Dish' aus? –

+0

öffentliche Klasse Dish {public int Id {get; einstellen; } public int CourseId {erhalten; einstellen; } öffentliche Zeichenfolge DishName {get; einstellen; } öffentliche Dezimalzahl? Preis {bekommen; einstellen; } öffentlichen Kurs Kurs {get; einstellen; } } – Peter

Antwort

2

Ihr Top-Level-foreach wie

wäre etwas
foreach (var courseGroup in Model.GroupBy(m => m.CourseName)) 

Und jedes Element sein würde:

<h2>courseGroup.Key</h2> 

<table class="table"> 
    @foreach (var item in courseGroup) 
    { 
     <tr> 
      <td>@item.DishName</td> 
      <td class="text-right">@item.Price</td> 
     </tr> 
    } 
</table> 

Allerdings können Sie organisieren Ihre Daten ein wenig mehr, wenn Sie also Ihre Klassen (und Tabellen in Ihrer Datenbank) definiert haben, etwa so:

public class Course 
{ 
    public string CourseName { get; set; } 
    public List<Dish> Dishes { get; set; } 
} 

public class Dish 
{ 
    public string DishName { get; set; } 
    public decimal Price { get; set; } 
} 

Dann wird Ihr Code viel einfacher:

foreach (var course in Model) //or Model.Courses - up to you 

Und jedes Element wäre:

<h2>course.CourseName</h2> 

<table class="table"> 
    @foreach (var item in course.Dishes) 
    { 
     <tr> 
      <td>@item.DishName</td> 
      <td class="text-right">@item.Price</td> 
     </tr> 
    } 
</table> 
0

Dank Rob für Ihre Hilfe. Ich schätze es! Ich wähle für die erste Option. Ich musste den Controller-Code mit einem Lambda-Ausdruck .Include(m => m.Course) erweitern, weil ich die Eigenschaft (CourseName) der ersten Klasse (Course.cs) enthalten musste. Die Dish-Klasse hatte bereits Lookup-Eigenschaft public Course Course { get; set; }) Also änderte ich die obere Ebene foreach in @foreach (var courseGroup in Model.GroupBy(m => m.Course.CourseName)) und dann hat alles gut geklappt.

Die zweite Option hat nicht funktioniert. Ich denke aufgrund der Demodata, die zwischen den beiden Klassen Course.cs und Dish.cs stehen, die eine CourseId-Eigenschaft haben.

Prost!

Verwandte Themen