21
votes

I have a mvc view with a partial view.There is a ActionResult method in the controller which will return a PartialView. So, I need to pass ViewBag data from that ActionResult method to Partial View.

This is my Controller

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

In Index.cshtml View

@Html.Partial("Step1")

Step1.cshtml partial view

@ViewBag.Hello

But this is not working. So, what is the correct way to get data from viewbag. I think I'm following wrong method. Please guide me.

6
"Partial view contains ActionResult method in the controller" what does this mean?Kelmen
ActionResult Method returns a PartialViewcp100
Why would you not put this on the model as a property, then pass the property value to the partial view as the partial view's model?ps2goat
you could use TempData instead, that worksAlisom Martins

6 Answers

6
votes

"Child actions follow a different controller/model/view lifecycle than parent actions. As a result they do not share ViewData/ViewBag."

The answer provides an alternate way of passing data.

Does a child action share the same ViewBag with its "parents" action?

14
votes

You can use it as mentioned below :

In your View :

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

And Your partial View :

@model String

<b>@Model</b>

As Shown Above ViewBag.Message will be passed to the partial view. and in your partial view you can use it as a @Model.

Note : here type of ViewBag.Message is string. You can pass any type.

12
votes

If you don't have to use ViewBag, you can use TempData. TempData is shared for the whole execution chain.

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

In Index.cshtml View

@Html.Partial("Step1")

Step1.cshtml partial view

@TempData["Hello"]
7
votes

Old question but if anyone here to find solution for this question..

You can pass viewbag value to partial with viewdatadictionary.

In your view:

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

and in partial view use it like this:

ViewData["permalink"]
0
votes

You can try this in order to pass ViewBag to partial view from action:

Your controller:

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


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

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

Your view (Index.cshtml):

@Html.Action("Step1")

Your partial view (_Partial1.cshtml):

@ViewBag.Hello
-1
votes
return PartialView("partialviewname", obj);