我会尽力解释我在寻找什么。
让我们说为了论证,我的数据库中有一个包含ID
,Item
,Category
...
表格填充如下:
================================
|ID| |Item | Category |
================================
| 1 | Batman | DC |
| 2 | Superman | DC |
| 3 | Aquaman | DC |
| 4 | Spiderman| Marvel |
| 5 | Ironman | Marvel |
| 6 | Thor | Marvel |
================================
现在,我想创建一个包含此信息的下拉列表...但是按类别分隔..
所以它看起来像这样:
现在它不需要像上面显示的那样格式化,只需要一个简单的嵌套列表,重点放在Category
我如何遍历表格,每次Category
更改一次打印该类别文本,然后打印与其下面的Item
对应的Category
?
答案 0 :(得分:2)
在MVC-5.2中,您可以使用接受SelectList
的{{1}} string dataGroupField
之一对您的选项进行分组。例如,在控制器中
model.OptionList = new SelectList(db.MyTable, "ID", "Item", "Category", null);
return View(model);
并在视图中
@Html.DropDownListFor(m => m.MyProperty, Model.OptionList)
或者,您可以构建IEnumerable<SelectListItem>
并设置Group
属性,例如
List<SelectListItem> optionList = new List<SelectListItem>
var groups = db.MyTable.GroupBy(x => x.Category);
foreach(var group in groups)
{
var optionGroup = new SelectListGroup() {Name = group.Key};
foreach (var item in group)
{
optionList.Add(new SelectListItem { Value = item.ID.ToString(), Text = item.Item, Group = optionGroup });
}
}
答案 1 :(得分:1)
如果您想按照最初提供的结果输出结果,可以使用GroupBy
调用完成此操作,然后只需遍历这些组(以及随后每组中的项目):
@foreach(var group in Model.GroupBy(g => g.Category))
{
<ol>
<li><b>@group.Key</b></li>
<ul>
@foreach(var item in group)
{
<li>- @item</li>
}
</ul>
</ol>
}
这假设您已经在Controller中拥有数据库中的对象,并且只是将它们的集合传递到View中。此外,此示例在View中执行,这不是理想的(您最好希望在实际模型中处理此逻辑)。
就创建一个DropDownList而言,如果你想在每个条目前面加上适当的类别,那么你真的可以这样做:
<select id='Hero' name='Hero'>
@foreach(var hero in Model)
{
<option value='hero.ID'>@hero.Category - @hero.Item</option>
}
</select>