web-dev-qa-db-fra.com

Une action enfant partage-t-elle le même ViewBag avec son action "parents"?

Je suis confus avec ceci: j'ai une action, disons Parent, et dans le fichier de vue correspondant, j'ai appelé une action enfant, disons Child, les actions Parent et Child sont dans le même contrôleur.

et j'ai besoin de l'action Enfant et de l'action Parent pour partager des données dans le ViewBag.Maintenant, que dois-je faire? Voici ma question:

lorsque j'appelle l'action Child dans le fichier de vue du parent, je lui passe le viewbag comme ceci: @ Html.Action (ViewBag). dans mon action d'enfant, je fais ceci:

public PartialViewResult Child(Object ViewBag)
{
  //using the data in ViewBag
}

Est-ce la bonne façon? L'objet viewbag est-il passé par référence ou s'agit-il d'un autre objet que le viewbag d'origine (plus de mémoire nécessaire)?

Ou si l'action enfant partage le Viewbag avec son action parent appelante par défaut?

D'après la réponse de Darin Dimitrov, je savais que je ne pouvais pas faire quelque chose comme ça: @ Html.Action (ViewBag)

Mais j'ai vraiment besoin de passer les muti-paramètres de l'action enfant, que puis-je faire?

32
NextStep

Les actions enfants suivent un cycle de vie contrôleur/modèle/vue différent de celui des actions parent. Par conséquent, ils ne partagent pas ViewData/ViewBag. Si vous souhaitez passer des paramètres à une action enfant du parent, vous pouvez le faire:

@Html.Action("Child", new { message = ViewBag.Message })

et dans l'action enfant:

public ActionResult Child(string message)
{
    ...
}
40
Darin Dimitrov

Il existe un moyen, mais vous devez créer une classe abstraite personnalisée comme classe de base pour vos vues de rasoir. Exposez ensuite tout ce dont vous avez besoin des actions parent à enfant. Voici comment j'obtiens le ViewBag du contrôleur racine dans une classe héritant de WebViewPage

    private dynamic GetPageViewBag()
    {
        if (Html == null || Html.ViewContext == null) //this means that the page is root or parial view
        {
            return ViewBag;
        }
        ControllerBase controller = Html.ViewContext.Controller;

        while (controller.ControllerContext.IsChildAction)  //traverse hierachy to get root controller
        {
            controller = controller.ControllerContext.ParentActionViewContext.Controller;
        }
        return controller.ViewBag;
    }
14
mitsbits