我还在学习.net MVC,也许我没有正确地搜索我需要找到解决方案。
简而言之,我在数据库中有一个表格结构为:
ID Category Subcategory FK
因此,每个类别可能会出现多次,以及每个子类别,这是该类别所独有的。
我想在视图中呈现如下菜单:
Category 1
Subcategory 1a
Subcategory 1b
Subcategory 1c
Category 2
Subcategory 2a
Subcategory 2b
等等。现在我在控制器中有:
var categories = db.Category
.Where(oa => oa.Category != "")
.GroupBy(oa => new { oa.Category, oa.Subcategory })
.Select(oa => oa.FirstOrDefault());
但是,我不确定如何在视图中执行我想要实现的目标。我知道我必须以某种方式遍历列表,但我不确定如何。我知道它涉及的内容如下:
@foreach (var item in Model)
{
<li>
<a id="@item.ID" href="#">@item.Category</a>
</li>
}
但我只希望每个类别出现一次,然后需要所有子类别出现在父类别下。或者我可能需要更改控制器以及它如何发送数据?
答案 0 :(得分:4)
首先创建一个简单的视图模型来表示您想要在视图中显示的内容
public class CategoryVM
{
public string Name { get; set; }
public IEnumerable<string> SubCategories { get; set; }
}
然后将查询投影到该视图模型的集合并将其返回到视图
var model = db.Category.Where(x => x.Category != "")
.GroupBy(x => x.Category).Select(x => new CategoryVM
{
Name = x.Key,
SubCategories = x.Select(y => y.Subcategory)
});
return View(model);
并在视图中
@model IEnumerable<CategoryVM>
....
@foreach(var category in Model)
{
<h2>@category.Name</h2>
<ul>
@foreach(var subCategory in category.SubCategories)
{
<li>@subCategory</li>
}
</ul>
}