web-dev-qa-db-fra.com

Passer le viewbag à la vue partielle depuis le contrôleur d'action

J'ai une vue de mvc avec une vue partielle. Il y a une méthode ActionResult dans le contrôleur qui renverra une PartialView. Je dois donc transmettre les données ViewBag de cette méthode ActionResult à la vue partielle.

Ceci est mon contrôleur

public class PropertyController : BaseController
{
    public ActionResult Index()
    {
        return View();
    }
    public ActionResult Step1()
    {
        ViewBag.Hello = "Hello";
        return PartialView();
    }
}

Dans la vue Index.cshtml

@Html.Partial("Step1")

Vue partielle Step1.cshtml

@ViewBag.Hello

Mais ça ne fonctionne pas. Alors, quelle est la bonne façon d’obtenir des données de viewbag… Je pense que je suis la mauvaise méthode. Guidez-moi s'il-vous-plaît.

16
cp100

"Les actions enfants suivent un cycle de vie contrôleur/modèle/vue différent de celui des actions parent. Par conséquent, elles ne partagent pas ViewData/ViewBag."

La réponse fournit un autre moyen de transmettre des données.

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

5
ps2goat

Vous pouvez l'utiliser comme mentionné ci-dessous: 

Dans votre vue: 

@Html.Partial("[ViewName]", (string)ViewBag.Message)

Et votre vue partielle: 

@model String

<b>@Model</b>

Comme indiqué ci-dessus, ViewBag.Message sera transmis à la vue partielle. et dans votre vue partielle, vous pouvez l'utiliser comme @Model .

Remarque: ici type de ViewBag.Message est chaîne . Vous pouvez passer n'importe quel type. 

13
SpiderCode

Si vous n'êtes pas obligé d'utiliser ViewBag, vous pouvez utiliser TempData. TempData est partagé pour toute la chaîne d'exécution. 

public class PropertyController : BaseController
{
    public ActionResult Index()
    {
        return View();
    }
    public ActionResult Step1()
    {
        TempData["Hello"] = "Hello";
        return PartialView();
    }
}

Dans la vue Index.cshtml

@Html.Partial("Step1")

Vue partielle Step1.cshtml

@TempData["Hello"]
9
Veysel Özdemir

Vieille question mais si quelqu'un ici trouve une solution à cette question ..

Vous pouvez passer la valeur de viewbag à partielle avec viewdatadictionary.

A votre avis:

@Html.Partial("_Partial", "", new ViewDataDictionary { { "permalink", ViewBag.Permalink } })

et en vue partielle l'utiliser comme ceci:

ViewData["permalink"]
0
bthn

Vous pouvez essayer ceci afin de passer ViewBag à une vue partielle de l'action:

Votre contrôleur:

public class PropertyController : Controller
{
    public ActionResult Index()
    {
        return View();
    }


    public ActionResult Step1()
    {
        ViewBag.Hello = "Hello";

        return PartialView("_Partial1", ViewBag.Hello);
    }
}

Votre vue (Index.cshtml):

@Html.Action("Step1")

Votre vue partielle (_Partial1.cshtml):

@ViewBag.Hello
0
Andrew Sin