使用迭代循环创建DropDownList

时间:2016-04-04 19:46:23

标签: c# razor asp.net-mvc-5 iteration

我会尽力解释我在寻找什么。

让我们说为了论证,我的数据库中有一个包含IDItemCategory ...

属性的表

表格填充如下:

================================
|ID|    |Item       | Category |
================================
|  1    |  Batman   |   DC     |
|  2    |  Superman |   DC     |
|  3    |  Aquaman  |   DC     |
|  4    |  Spiderman|   Marvel |
|  5    |  Ironman  |   Marvel |
|  6    |  Thor     |   Marvel |
================================

现在,我想创建一个包含此信息的下拉列表...但是按类别分隔..

所以它看起来像这样:

  1. DC
    • -Batman
    • -Superman
    • -Aquaman
  2. 惊奇
    • -Spiderman
    • -Ironman
    • -Thor
  3. 现在它不需要像上面显示的那样格式化,只需要一个简单的嵌套列表,重点放在Category

    我如何遍历表格,每次Category更改一次打印该类别文本,然后打印与其下面的Item对应的Category

2 个答案:

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