2016-04-04 4 views
0

Я попытаюсь изо всех сил объяснить, что я ищу.Создайте DropDownList, используя Iteration Loop

Скажу, ради аргумента, что у меня есть таблица в моей базе данных, которая имеет свойство ID, Item, Category ...

таблицы заполняются, как так:

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

Теперь я хотите создать раскрывающийся список с этой информацией ... но разделены категорией.

Таким образом, это будет выглядеть так:

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

Теперь не нужно быть в таком формате, как показано выше, но только простой вложенной с акцентом на Category

Как мне перебирать по таблице и каждый раз, когда Category изменяет печать этого текста категории один раз, затем распечатайте Item, соответствующие этому Category под ним?

+1

Http: // StackOverflow. com/questions/607188/support-for-optgroup-in-dropdownlist-net-mvc – Shyju

+0

Как насчет чего-то вроде этого: http://weblogs.asp.net/raduenuca/asp-net-mvc-extending-the-dropd ownlist-to-show-the-items-grouped-by-a-category –

+0

Вы используете asp.net-mvc? А если да, то какая версия? –

ответ

2

В MVC-5.2, вы можете использовать один из overloads из SelectList, который принимает string dataGroupField, чтобы задать свои параметры.Например, в контроллере

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

и в представлении

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

В качестве альтернативы вы можете создать IEnumerable<SelectListItem> и установить Group свойство, например

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

Если вы хотите выводить результаты, как вы изначально при условии, вы можете сделать это с помощью GroupBy вызова, а затем просто перебора этих групп (и впоследствии элементов в каждой группе):

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

Этого предполагает, что вы уже имеете объекты из своей базы данных в своем контроллере и просто передаете их в свой вид. Кроме того, этот пример выполняется в представлении, что не является идеальным (вы предпочитаете обрабатывать эту логику в самой фактической модели).

Что касается создания DropDownList идет, вы действительно могли бы сделать то же самое, если вы хотите, чтобы предварить каждую запись с ее соответствующей категории:

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

Вы также предполагаете, что он использует MVC, и я не вижу ничего в этом вопросе, чтобы указать на это. Не сказать, что это не так, просто сказать, что на этот вопрос не указано. Вопрос даже не указывает на веб-приложение. – Kevin

+0

Я принимал это только из тега 'model-view-controller', который был прикреплен к вопросу. –

+0

Хорошо, хорошо поймать, я даже не взглянул на теги, просто прочитал вопрос. – Kevin