Как связать вложенные ViewModels с View на Controller в MVC3?

Я разрабатываю приложение ASP.NET MVC 3 в C #, и я использую Razor. Теперь я имею дело с проблемой привязки объектов через ViewModels, переданные / полученные в / из представления по controllerу. Давайте поясним. У меня есть следующие ViewModels:

public class ContainerViewModel { public int ContainerId {get; set;} public string ContainerName {get; set;} public List ItemData {get; set;} } public class ItemPostModel { public int ItemId {get; set;} public string ItemName {get; set;} public int ItemValue {get; set;} } 

ContainerViewModel используется для передачи данных в представление. Его свойства ContainerId и ContainerName используются только для показа. Свойство List должно быть заполнено с помощью формы . Вид выглядит примерно так (это упрощенная версия):

 @Model.ContainerName @using (Html.BeginForm()) { 
@foreach(var item in Model.ItemData) { @Html.TextBox(item.ItemId); @Html.TextBox(item.ItemName); @Html.TextBox(item.ItemValue);

}
}

Соответствующие методы действия controllerа следующие:

 public ActionResult UpdateItems() { //fill in the ContainerViewModel lcontainer return View("UpdateItems", lcontainer); } [HttpPost] public ActionResult UpdateItems(int containerId, ItemPostModel itemData) { //store itemData into repository } 

Проблема в том, что с помощью этого кода элемент ItemPostModel itemData, переданный в MessageMethod UpdateItems , всегда пуст. Правильно передается containerId . Тот же результат, если я использую следующий код в controllerе (очевидно, не DRY);

 [HttpPost] public ActionResult UpdateItems(ContainerViewModel container) { //extract itemData from ContainerViewModel container //store itemData into repository } 

Как я могу «научить» приложение, что мне нужны элементы формы, хранящиеся в List ? Должен ли я изменить ModelBinder или есть более простой способ выполнить эту задачу? Спасибо всем за ваши ответы.

Не записывайте петли в виде. Используйте шаблоны редактора:

 @Model.ContainerName @using (Html.BeginForm()) { 
@Html.EditorFor(x => x.ItemData)
}

и внутри соответствующего шаблона редактора ( ~/Views/Shared/EditorTemplates/ItemPostModel.cshtml ):

 @model ItemPostModel @Html.TextBox(x => x.ItemId) @Html.TextBox(x => x.ItemName) @Html.TextBox(x => x.ItemValue) 

И в действии controllerа вам может потребоваться указать префикс:

 [HttpPost] public ActionResult UpdateItems( int containerId, [Bind(Prefix = "ItemData")]ItemPostModel itemData ) { //store itemData into repository } 

и это должно быть почти все. Шаблон редактора позаботится о создании правильных имен полей ввода для привязки к работе.

  • Открытие «известного типа файла» в исполняемом экземпляре настраиваемого приложения - .NET
  • Разница указателей / адресов
  • Есть ли способ заставить все ссылочные сборки загружаться в домен приложения?
  • Ошибка включения openmp - "ld: библиотека не найдена для -lgomp" и Clang errors
  • Почему (int) (объект) 10m бросает исключение «Указанный приведение недействителен»?
  • Как скомпилировать / связать Boost с clang ++ / libc ++?
  • Оператор <и строгий слабый порядок
  • C # Lambda (=>)
  • Как получить имя текущего метода из кода
  • Как проверить статическую функцию
  • Предотrotation атаки SQL Injection: с чего начать
  • Давайте будем гением компьютера.