J'ai deux modèles de vue:
public class ParentViewModel
{
public Id { get; set; }
.....
public ChildViewModel Child{ get; set; }
}
public class ChildViewModel
{
public ChildId { get; set; }
.....
}
Contrôleurs:
public ActionResult Index()
{
.... <some code>
return View("NewIndex", ParentViewModel);
}
[HttpPost]
public ActionResult PartialAction(ChildViewModel childView)
{
return RedirectToAction("Index");
}
Et vues: Index
@model ParentViewModel
....
@Html.Partial("_Partial", Model.Child)
et _partielle
@model ChildViewModel
... do some stuff with child model
Lorsque j'essaie d'ouvrir la page d'index, j'ai une erreur:
L'élément de modèle transmis au dictionnaire est de type 'ParentViewModel', mais ce dictionnaire nécessite un élément de modèle de type 'ChildViewModel'.
Pourquoi tente-t-il de passer ParentViewModel au lieu de ChildViewModel. Qu'est-ce que je fais mal?
J'ai eu le même problème que l'OP. À partir d’un des commentaires, j’ai réalisé que le deuxième paramètre ne devait pas être nul, c’est-à-dire de
@model ParentViewModel
@Html.Partial("_Partial", Model.Child)
Si Model.Child est null, alors Model est passé à la place de Model.Child. S'il existe des cas où le second paramètre est null, vous devrez alors vérifier d'abord dans votre code et éventuellement passer un enfant initialisé comme second paramètre. Quelque chose comme ça
@Html.Partial("_Partial", new Child())
La réponse est qu'il faut passer un objet vide à Partial, comme
@Html.Partial("_Partial", new ChildViewModel ())
Vous pouvez plutôt renvoyer PartialView("...")
d'un Controller
et appeler l'action à partir de la vue Index.
Contrôleurs:
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");
}
Et index
@model ParentViewModel
....
@Html.Action("Partial", Model.Child)
Sinon, vous pouvez initialiser ParentViewModel dans le Index()
public ActionResult Index ()
{
.... <some code>
return View("NewIndex", new ParentViewModel{Child = new ChildViewModel});
}