3

我正在尝试学习 MVC 并找到一些障碍。

我试图找到一种可维护的方式来呈现按类别标题划分的项目列表。例如:

进入


面包

主要的

鸡肉
牛肉
素食

沙漠

蛋糕
冰淇淋

类别和项目是单独的模型,项目模型保存类别的 ID。

我想将这些页面提供给熟悉 HTML 但不熟悉 ASP 的人。出于这个原因,我想尽量减少嵌入在页面中的代码。这是迄今为止我最好的,但我不满意必须使用和检查每个项目的变量。

@{string categoryName = null;}
@foreach (var item in Model) {
    if (item.CategoryName != categoryName)
    {
        categoryName = item.CategoryName;
    <tr>
        <td colspan="5">@Html.DisplayFor(modelItem => categoryName)</td>
    </tr>
    }
    <tr><!-- Display item here --></tr>
}

有没有一种嵌套页面的方法,这样我就可以创建一个遍历每个类别的父页面并调用一个遍历该类别中项目的子页面?例如,类似:

@foreach (var item in Model) {
    <tr>
        <td colspan="5">@Html.DisplayFor(modelItem => item.Name)</td>
    </tr>
    @RenderChildren(item.Children);
}
4

1 回答 1

3

我建议返回一个视图模型,该模型使用以下方式预先分组了项目GroupBy

return View(TheModel.GroupBy(item => item.Category).ToArray());

此视图可以遍历组,显示每个 ( Key) 的标题并将项目集合发送到部分视图:

@model IEnumerable<IGrouping<string, MyModel>> 

@foreach (var grp in Model)
{
    <tr>
        <th colspan="5">@grp.Key</th>
    </tr>

    @Html.Partial("Meals", grp.ToArray())
}

然后,单独的局部视图“Meals.cshtml”接受IEnumerable您的模型类型作为其模型。

@model IEnumerable<MyModel>

@foreach (var item in Model)
{
    <tr>
        <td>@Model.Name</td>
    </tr>
}
于 2012-11-21T05:47:08.550 回答