Вместо того, чтобы возиться с циклами foreach и т. Д., Я бы просто использовал модель представления и шаблоны редактора. Это облегчает жизнь.
Итак, начнем с просмотра модели:
public class MyViewModel
{
public IEnumerable<Type1> TheFirstList { get; set; }
}
public class Type1
{
public IEnumerable<Type2> TheSecondList { get; set; }
}
public class Type2
{
public string ThePropertyIWantToSet { get; set; }
public IEnumerable<SelectListItem> Items
{
get
{
return new[]
{
new SelectListItem { Value = "1", Text = "item 1" },
new SelectListItem { Value = "2", Text = "item 2" },
new SelectListItem { Value = "3", Text = "item 3" },
};
}
}
}
затем контроллер:
public class HomeController : Controller
{
public ActionResult Index()
{
// filling with dummy values => those should probably
// come from your data store
var model = new MyViewModel
{
TheFirstList = Enumerable.Range(1, 2).Select(x => new Type1
{
TheSecondList = Enumerable.Range(1, 3).Select(y => new Type2())
})
};
return View(model);
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
Тогда соответствующий ~/Views/Home/Index.cshtml
просмотр:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.TheFirstList)
<input type="submit" value="OK" />
}
Шаблон ~/Views/Home/EditorTemplates/Type1.cshtml
:
@model Type1
@Html.EditorFor(x => x.TheSecondList)
и, наконец, шаблон ~/Views/Home/EditorTemplates/Type2.cshtml
:
@model Type2
@Html.DropDownListFor(
x => x.ThePropertyIWantToSet,
new SelectList(Model.Items, "Value", "Text")
)
Теперь в действии POST вы получите красивую и правильно привязанную модель представления. Шаблоны редактора позаботятся о создании правильных имен полей ввода. Посмотрите, насколько просто и понятно код. Не нужно писать какие-либо циклы в представлениях, беспокоиться о правильных индексах, просто оставить это для фреймворка.