Как связать вложенные 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()) { }
Соответствующие методы действия 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 или есть более простой способ выполнить эту задачу? Спасибо всем за ваши ответы.
- Как установить значок для моего приложения в visual studio 2008?
- Выражение типа «System.Int32» не может использоваться для возвращаемого типа «System.Object»
- Инвертировать инструкцию «if» для уменьшения вложенности
- Есть ли способ имитировать концепцию «друга» C ++ в Java?
- Как настроить пользовательские настройки JsonSerializer для Json.NET в веб-API MVC 4?
- Преобразование 2-мерного массива
- Являются ли IEnumerable методы Linq streamобезопасными?
- Объединить данные гироскопа и акселерометра
Не записывайте петли в виде. Используйте шаблоны редактора:
@Model.ContainerName @using (Html.BeginForm()) { }
и внутри соответствующего шаблона редактора ( ~/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 }
и это должно быть почти все. Шаблон редактора позаботится о создании правильных имен полей ввода для привязки к работе.