如何使用嵌套字幕制作C#foreach?

时间:2016-10-15 00:42:29

标签: c# linq foreach

您好,我是初学者,我正在使用 ASP.NET和MVC5

我想制作 IEnumerable<> Food-Menu-Pricelist,其中包含1个foreach中的嵌套标题(课程),因此我可以使用我使用Entity Framework进行的CRUD操作创建或编辑新字符串(CourseName)。

我将在下面的链接中嵌入一张图片,我将其制作为半/硬编码,就像您在代码中看到的那样,标题是硬编码的。

预览我想要达到的结果: preview of result I want to reach

我有2个型号:

  1. Course.cs =包含属性字符串的标题: CourseName
  2. Dish.cs =和包含属性字符串的列表: DishName
  3. 有没有办法可以将这个表格放在1个foreach 中,这样我也可以使用我定义的te模型用CRUD-Operations编辑标题?

    我已经尝试了很多事情。无论如何这是我在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>
    

2 个答案:

答案 0 :(得分:2)

您的顶级foreach类似于

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

每个项目都是:

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

但是,您可以更多地组织数据,因此如果您定义了类(以及数据库中的表),则如下所示:

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

然后你的代码变得更简单了:

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

每个项目都是:

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

答案 1 :(得分:0)

感谢Rob的帮助。我很感激! 我选择第一个选项。 我不得不使用lamda-expression .Include(m => m.Course)扩展Controller代码,因为我需要包含第一个类(Course.cs)的属性(CourseName)。 Dish类已经有Lookup属性public Course Course { get; set; })所以我改变了@foreach (var courseGroup in Model.GroupBy(m => m.Course.CourseName))中的顶级foreach,然后一切都很顺利。

第二种选择不起作用。我认为,因为两个类Course.cs之间的demodata是一个具有CourseId属性的Dish.c。

干杯!