2016-11-14 75 views
0

比方說,我有一個Person類具有一種方法,使DropDownListFor與下拉菜單中的MVC剃刀

public string Name {get;set;} 

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

,我試圖綁定List<Person>到DropDownListFor所以它看起來像

下拉:
  - 第一人稱
      - 第一人稱
012的listOfStrings第一串    - 第一人稱的listOfStrings的第二個字符串
  - 第二人
      - 第二個人
     的listOfStrings的第一個字符串 - 第二個人的listOfStrings的第二個字符串
      - 列表中的第三個字符串第二個人的字符串

有沒有辦法讓它變成這樣?只有列表中的字符串應該是可選的,而不是人的名字。我很好與任何

回答

0

我不知道是否有一個以上的模型和foreach循環這樣其他的剃刀方式,但你正在尋找的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的詳細說明here

+0

你的編輯對我幫助很大,感謝的人 – TestzWCh

1

這是相對直截了當的。唯一棘手的部分是將所有字符串值選擇到一個大列表中,同時仍然鍵入特定的人。謝天謝地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) 
+0

這是5.2 RC - 見工作項[#1703](HTTPS://aspnetwebstack.codeplex。 com/workitem/1703) – Sam07

+0

@Sam:很酷。謝謝。我真的希望MSDN文檔能夠指出你需要什麼樣的MVC版本。相反,你得到的只是MVC命名空間的一部分,所以它需要一些未指定的MVC版本。謝謝,MS;)。 –