2 votes

Comment faire un foreach en C# avec des sous-titres imbriqués ?

Bonjour, je suis débutant et je travaille avec ASP.NET avec MVC5 .

Je veux faire un IEnumerable<> Food-Menu-Pricelist avec titres imbriqués (Cours) dans 1 foreach pour pouvoir créer ou modifier une nouvelle chaîne (CourseName) avec les opérations CRUD que j'ai effectuées avec Entity Framework.

Je vais intégrer une image dans le lien ci-dessous que j'ai codé en semi-dur et comme vous pouvez le voir dans le fichier code ci-dessous les titres sont codés en dur.

Aperçu du résultat que je souhaite atteindre : preview of result I want to reach

J'ai deux modèles :

  1. Course.cs = le titre avec la chaîne de caractères Property : Nom du cours
  2. Dish.cs = et la liste avec Property string : Nom du plat

Existe-t-il un moyen de mettre ce tableau en 1 foreach de manière à ce que je puisse également éditer le titre avec les opérations CRUD avec le modèle que j'ai défini ?

J'ai déjà beaucoup essayé d'y parvenir. En tout cas, c'était ma première question sur Stackoverflow

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

2voto

Rob Points 2095

Votre niveau supérieur foreach serait quelque chose comme

foreach (var courseGroup in Model.GroupBy(m => m.CourseName))

Et chaque élément serait :

<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>

Cependant, vous pouvez organiser vos données un peu plus, si vous définissez vos classes (et les tables de votre base de données) comme suit :

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; }
}

Votre code devient alors beaucoup plus simple :

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

Et chaque élément serait :

<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>

0voto

Peter Points 13

Merci Rob pour ton aide. Je l'apprécie beaucoup ! J'ai choisi la première option. J'ai dû étendre le code du contrôleur avec une expression lamda .Include(m => m.Course) parce que j'avais besoin d'inclure la propriété (CourseName) de la première classe (Course.cs). La classe Dish avait déjà la propriété Lookup public Course Course { get; set; } ) J'ai donc modifié le niveau supérieur de la recherche en @foreach (var courseGroup in Model.GroupBy(m => m.Course.CourseName)) et tout s'est bien passé.

La deuxième option n'a pas fonctionné. Je pense que c'est à cause des données démographiques qui sont liées entre les deux classes Course.cs et Dish.cs qui ont une propriété CourseId.

¡Salud!

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