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

本文关键字:DropDownListFor 方法 Razor MVC 一种 | 更新日期: 2023-09-27 18:17:48

假设我有一个Person类,它有

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

,我试图将List<Person>绑定到DropDownListFor,所以它看起来像

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

有办法让它变成那样吗?只有列表中的字符串应该是可选择的,而不是人的名字。

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

这是比较直接的。唯一棘手的部分是将所有字符串值选择到一个大列表中,同时仍然指向特定的人。值得庆幸的是,SelectMany有一个resultSelector参数,可以让你做到这一点。然后,您只需将所有内容选择到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)

我不知道除了模型和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创建比foreach循环更优雅的HTML的详细说明。