viewmodels net mvc how generate from create asp c# asp.net-mvc-3 binding viewmodel

c# - how - viewmodel asp net mvc 4



¿Cómo puedo vincular ViewModels anidados de View a Controller en MVC3? (1)

No escribir bucles en una vista. Use plantillas de editor:

<strong>@Model.ContainerName</strong> @using (Html.BeginForm()) { <fieldset> @Html.EditorFor(x => x.ItemData) <input type="submit" value="Save" /> </fieldset> }

y dentro de la plantilla del editor correspondiente ( ~/Views/Shared/EditorTemplates/ItemPostModel.cshtml ):

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

Y en la acción del controlador puede necesitar especificar el prefijo:

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

y eso debería ser casi todo. La plantilla del editor se ocupará de generar los nombres de campo de entrada adecuados para que funcione el enlace.

Estoy desarrollando una aplicación ASP.NET MVC 3 en C # y uso Razor. Ahora estoy lidiando con un problema relacionado con el enlace de objetos a través de ViewModels pasado / recibido a / desde la vista por el controlador. Vamos a dejarlo en claro. Tengo los siguientes ViewModels:

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

El ContainerViewModel se usa para pasar los datos a la Vista. Sus propiedades ContainerId y ContainerName se utilizan solo para fines de visualización. La propiedad List<ItemPostModel> debe rellenarse utilizando un Formulario . La vista se ve algo así (es una versión simplificada):

<strong>@Model.ContainerName</strong> @using (Html.BeginForm()) { <fieldset> @foreach(var item in Model.ItemData) { @Html.TextBox(item.ItemId); @Html.TextBox(item.ItemName); @Html.TextBox(item.ItemValue); <p> <input type="submit" value="Save" /> </p> } </fieldset> }

Los métodos de acción correspondientes del controlador son los siguientes:

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

El problema es que con este código, ItemPostModel itemData pasado a Post ActionMethod UpdateItems siempre está vacío. El identificador de contenedor se pasa correctamente. El mismo resultado si utilizo el siguiente código en el controlador (obviamente no es SECO);

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

¿Cómo puedo "enseñar" la aplicación que quiero que los elementos del formulario almacenen en la List<ItemPostModel> ? ¿Debo modificar el ModelBinder o hay una manera más simple de realizar esta tarea? Gracias a todos por sus respuestas.