Pass viewbag to partial view from action controller

80.1k Views Asked by At

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

There are 6 best solutions below

0
On BEST ANSWER

"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?

0
On

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.

0
On

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
On

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"]
0
On

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
2
On
return PartialView("partialviewname", obj);