Если вам нужно отобразить несколько раскрывающихся списков, то вам может потребоваться адаптировать модель представления. Итак, давайте рассмотрим пример:
public class ItemsViewModel
{
public string Label { get; set; }
public string SelectedId { get; set; }
public IEnumerable<SelectListItem> Values { get; set; }
}
public class MyViewModel
{
public IEnumerable<ItemsViewModel> Items { get; set; }
}
затем выполните действие контроллера, которое заполнит эту модель представления:
public ActionResult Index()
{
var model = new MyViewModel
{
Items = new[]
{
// TODO: fetch from your repository
new ItemsViewModel
{
Label = "label 1",
Values = new[]
{
new SelectListItem { Value = "1", Text = "item 1" },
new SelectListItem { Value = "2", Text = "item 2" }
}
},
new ItemsViewModel
{
Label = "label 2",
// Automatically preselect the second item in the ddl
SelectedId = "B",
Values = new[]
{
new SelectListItem { Value = "A", Text = "foo1" },
new SelectListItem { Value = "B", Text = "bar" }
}
},
}
}
return View(model);
}
и затем иметь соответствующий строго типизированный вид:
<table>
<thead>
<tr>
<th>Label</th>
<th>Values</th>
</tr>
</thead>
<tbody>
<%= Html.EditorFor(x => x.Items)
</tbody>
</table>
и в соответствующем шаблоне редактора (~/Views/Shared/EditorTemplates/ItemsViewModel.ascx
):
<%@ Control
Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.ItemsViewModel>"
%>
<tr>
<td>
<%: Model.Label %>
</td>
<td>
<%= Html.DropDownListFor(
x => x.SelectedId,
new SelectList(Model.Items, "Values", "Text")
) %>
</td>
</tr>