我正在尝试学习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);
}
答案 0 :(得分: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>
}