with vista una que parcial mvc example asp.net-mvc partial-views asp.net-mvc-viewmodel

asp.net mvc - una - Como pasar el modelo a vista parcial.



render partial view mvc 5 (3)

Tengo dos modelos de vista:

public class ParentViewModel { public Id { get; set; } ..... public ChildViewModel Child{ get; set; } } public class ChildViewModel { public ChildId { get; set; } ..... }

Controladores:

public ActionResult Index() { .... <some code> return View("NewIndex", ParentViewModel); } [HttpPost] public ActionResult PartialAction(ChildViewModel childView) { return RedirectToAction("Index"); }

Y vistas: Index

@model ParentViewModel .... @Html.Partial("_Partial", Model.Child)

y _Partial

@model ChildViewModel ... do some stuff with child model

Cuando intento abrir la página de índice, aparece un error:

El elemento del modelo que se pasa al diccionario es del tipo ''ParentViewModel'', pero este diccionario requiere un elemento modelo del tipo ''ChildViewModel''.

Por qué intenta pasar ParentViewModel en lugar de ChildViewModel. ¿Qué estoy haciendo mal?


En su lugar, puede devolver PartialView("...") desde un Controller y llamar a la acción desde la vista de índice.

Controladores:

public ActionResult Index() { .... <some code> return View("NewIndex", ParentViewModel); } public ActionResult Partial(ChildViewModel cvm) { var vm = cvm ?? new ChildViewModel(); //if cvm from the parent view is null, return new cvm return PartialView("_Partial", vm) //return partial view } [HttpPost] public ActionResult PartialAction(ChildViewModel childView) { return RedirectToAction("Index"); }

Y el índice

@model ParentViewModel .... @Html.Action("Partial", Model.Child)

Alternativamente, puede inicializar ParentViewModel en el Index() público Índice de ActionResult ()

{ .... <some code> return View("NewIndex", new ParentViewModel{Child = new ChildViewModel}); }


La respuesta es que necesita pasar un objeto vacío a Parcial, como

@Html.Partial("_Partial", new ChildViewModel ())


Tuve el mismo problema que el OP. De uno de los comentarios, me di cuenta de que el segundo parámetro no debería ser nulo, es decir, de

@model ParentViewModel @Html.Partial("_Partial", Model.Child)

Si Model.Child es nulo, entonces se pasa Model en lugar de Model.Child . Si habrá casos en que el segundo parámetro sea nulo, entonces tendrá que verificar primero en su código y tal vez pasar un Child inicializado como segundo parámetro. Algo como esto

@Html.Partial("_Partial", new Child())