web-dev-qa-db-fra.com

Comment passer du modèle à une vue partielle

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?

32
DarkNik

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())
43
Dev

La réponse est qu'il faut passer un objet vide à Partial, comme

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

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});
}
0
dey.shin