一种在 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)
假设我有一个 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)