一种在 MVC Razor 中使用 DropDowns 制作 DropDownListFor 的方法

A way to make DropDownListFor with DropDowns inside in MVC Razor

假设我有一个 class 人

public string Name {get;set;}

public List<string> ListOfStrings  {get;set;}

我正在尝试将 List<Person> 绑定到 DropDownListFor 所以它看起来像

下拉菜单:
- 第一人称
- 第一人称的 listOfStrings 的第一个字符串
- 第一人称的 listOfStrings 的第二个字符串
- 第二人称
- 第二人称的 listOfStrings 的第一个字符串
- 第二人称的 listOfStrings 的第二个字符串
- 第二人称的 listOfStrings 的第三个字符串

等等

有没有办法让它变成那样?只有列表中的字符串应该是可选的,而不是人名。我什么都好

我不知道除了模型和 foreach 循环之外是否有 Razor 方法可以做到这一点,但是您正在寻找的 HTML 将是这样的

<select>
  <optgroup label="Person1">
    <option value="ListOfStrings1">ListOfStrings1</option>
    <option value="ListOfStrings2">ListOfStrings2</option>
  </optgroup>
  <optgroup label="Person2">
    <option value="ListOfStrings3">ListOfStrings3</option>
    <option value="ListOfStrings4">ListOfStrings4</option>
  </optgroup>
</select>

编辑:从 MVC 5.2 开始,实际上 一种执行此操作的方法。您可以找到有关如何使用 Razor 创建此 HTML 的详细说明,比使用 foreach 循环更优雅 here.

这相对简单明了。唯一棘手的部分是 select 将所有字符串值合并到一个大列表中,同时仍然针对特定的人。值得庆幸的是 SelectMany 有一个 resultSelector 参数可以让你做到这一点。然后,您只需 select 将所有内容放入 SelectListItem 的列表中,并为每个指定 Group 属性。然后 Razor 将愉快地负责在 HTML 中生成适当的 optgroups。需要注意的一件事:我认为指定组的能力直到 MVC 5 才出现。

ViewBag.DropDownOptions = db.People
    .SelectMany(m => m.ListOfStrings, (m, str) => new { Name = m.Name, String = str })
    .Select(m => new SelectListItem
    {
        Value = m.String,
        Text = m.String,
        Group = new SelectListGroup { Name = m.Name }
    });

那么,在您看来:

@Html.DropDownListFor(m => m.Foo, (IEnumerable<SelectListItem>)ViewBag.DropDownOptions)