2016-04-04 11 views
0

Ich werde mein Bestes versuchen zu erklären, was ich suche.Erstellen DropDownList mit Iterationsschleife

ist für Argument willen sagen lassen, dass ich eine Tabelle in meiner Datenbank haben, die die Eigenschaften ID hat, Item, Category ...

die Tabelle als so bevölkert ist:

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

Nun, ich Ich möchte eine Dropdownliste mit diesen Informationen erstellen ... aber getrennt nach der Kategorie ..

So würde es so aussehen:

  1. DC
    • -Batman
    • -Superman
    • -Aquaman
  2. Marvel
    • -Spiderman
    • -Ironman
    • -Thor

Nun ist es nicht so formatiert werden müssen, wie oben gezeigt, sondern nur eine einfache verschachtelte Liste mit dem Schwerpunkt auf der Category

Wie würde ich durch die Tabelle iterieren und jedes Mal, wenn sich die Category ändert, um den Kategorietext einmal zu drucken, dann die Item, die mit dieser Category darunter entsprechen, drucken?

+1

http: // Stackoverflow. com/questions/607188/support-für-optgroup-in-dropdownlist-net-mvc – Shyju

+0

Wie wäre es mit so etwas: http://weblogs.asp.net/raduenuca/asp-net-mvc-extend-the-dropd ownlist-to-show-the-items-gruppiert nach Kategorie –

+0

Verwenden Sie asp.net-mvc? Und wenn ja welche Version? –

Antwort

2

In MVC-5.2 können Sie eine der overloads von verwenden SelectList akzeptiert string dataGroupField, um Ihre Optionen zu gruppieren.Zum Beispiel in der Steuerung

model.OptionList = new SelectList(db.MyTable, "ID", "Item", "Category", null); 
return View(model); 

und in der Ansicht

@Html.DropDownListFor(m => m.MyProperty, Model.OptionList) 

Alternativ können Sie eine IEnumerable<SelectListItem> und stellen Sie die Group Eigenschaft, zum Beispiel bauen

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

Wenn Sie ausgeben Ihre Ergebnisse wollten, wie Sie zunächst zur Verfügung gestellt, können Sie dies erreichen, indem ein GroupBy Anruf mit und dann einfach durch diese Gruppen laufen (und anschließend die Einzelteile innerhalb jeder Gruppe):

@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> 
} 

Diese geht davon aus, dass Sie die Objekte aus Ihrer Datenbank bereits in Ihrem Controller haben und diese einfach in Ihre Ansicht übernehmen. Außerdem wird dieses Beispiel in der Ansicht ausgeführt, was nicht ideal ist (Sie möchten diese Logik vorzugsweise im eigentlichen Modell selbst behandeln).

Soweit ein Dropdownlist zu schaffen geht, könnte man wirklich das gleiche tun, wenn Sie jeden Eintrag mit der entsprechenden Kategorie Vorwort wollte:

<select id='Hero' name='Hero'> 
@foreach(var hero in Model) 
{ 
    <option value='hero.ID'>@hero.Category - @hero.Item</option> 
} 
</select> 
+0

Sie vermuten auch, dass er MVC verwendet und ich sehe nichts in der Frage, um dies anzuzeigen. Nicht zu sagen, dass er es nicht ist, ich sage nur, dass es nicht wirklich durch die Frage angezeigt wird. Die Frage weist nicht einmal auf eine Webanwendung hin. – Kevin

+0

Ich nahm das nur von dem Tag 'model-view-controller' an, der an die Frage angehängt wurde. –

+0

Ok, guter Fang, ich habe mir die Tags nicht einmal angesehen, lies nur die Frage. – Kevin

Verwandte Themen