vista una por pasar parametros mvc enviar ejemplos controlador asp.net-mvc asp.net-mvc-3 razor asp.net-mvc-views

una - Cómo vincular el parámetro de tipo de diccionario para ambas acciones GET y POST en ASP.NET MVC



pasar parametros de una vista a un controlador mvc (2)

Eche un vistazo a esta publicación de scott hanselman. Hay ejemplos de vinculación de modelos a un diccionario, listas, etc.

Quiero definir una vista que muestre una lista de etiquetas y casillas de verificación, el usuario puede cambiar la casilla de verificación y luego publicar de nuevo. Tengo problemas para publicar el diccionario. Es decir, el parámetro de diccionario para el método de publicación es nulo.

A continuación se muestran el método de acción para ambas acciones, GET y POST:

public ActionResult MasterEdit(int id) { Dictionary<string, bool> kv = new Dictionary<string, bool>() { {"A", true}, {"B", false} }; return View(kv); } [HttpPost] public ActionResult MasterEdit(Dictionary<string, bool> kv) { return RedirectToAction("MasterEdit", new { id = 1 }); }

Beliw es la vista

@model System.Collections.Generic.Dictionary<string, bool> @{ ViewBag.Title = "Edit"; } <h2> MasterEdit</h2> @using (Html.BeginForm()) { <table> @foreach(var dic in Model) { <tr> @dic.Key <input type="checkbox" name="kv" value="@dic.Value" /> </tr> } </table> <input type="submit" value="Save" /> }

¡Cualquier idea sería muy apreciada!


No use un diccionario para esto. No juegan bien con el modelo de encuadernación. Podría ser un PITA.

Un modelo de vista sería más apropiado:

public class MyViewModel { public string Id { get; set; } public bool Checked { get; set; } }

luego un controlador:

public class HomeController : Controller { public ActionResult Index() { var model = new[] { new MyViewModel { Id = "A", Checked = true }, new MyViewModel { Id = "B", Checked = false }, }; return View(model); } [HttpPost] public ActionResult Index(IEnumerable<MyViewModel> model) { return View(model); } }

luego una vista correspondiente ( ~/Views/Home/Index.cshtml ):

@model IEnumerable<MyViewModel> @using (Html.BeginForm()) { <table> <thead> <tr> <th></th> </tr> </thead> <tbody> @Html.EditorForModel() </tbody> </table> <input type="submit" value="Save" /> }

y finalmente la plantilla del editor correspondiente ( ~/Views/Home/EditorTemplates/MyViewModel.cshtml ):

@model MyViewModel <tr> <td> @Html.HiddenFor(x => x.Id) @Html.CheckBoxFor(x => x.Checked) @Html.DisplayFor(x => x.Id) </td> </tr>