Using ViewData to pass string from Controller to View in ASP.NET MVC3
Asked Answered
P

2

7

I am trying to pass a random string from my Controller to the View.

Here is my Controller code:

 [HttpPost]
    public ActionResult DisplayForm(UserView user)
    {
       //some  data processing over here
        ViewData["choice"] = "Apple";

        return RedirectToAction("Next", "Account");
    }

Now I want to pass that data value "Apple" to my view Next.cshtml which is created as follows:

//View: Next.cshtml

  @{
    ViewBag.Title = "Thanks for registering";
    Layout = "~/Content/orangeflower/_layout.cshtml";
   }
    <p>Your favorite fruit is:</p>@ViewData["choice"]

But I am not able to see my data in the browser when the project runs.

Here is the snapshot:

1) On debug, the controller showing the value:

enter image description here

2) The browser view doesn't show the value "Apple"

enter image description here

3) On further debug to my Next.cshtml View: enter image description here

Why is the value not getting passed to the View correctly. Both my controllers for Next and DisplayForm are within the same Controller AccountController.cs , still value not getting displayed.

Can someone help me solve this ?

Polity answered 10/1, 2012 at 12:54 Comment(0)
R
12

You are not rendering a view, you are redirecting. If you wanted to pass some information tyo the view you need to return this view after adding it to ViewData:

[HttpPost]
public ActionResult DisplayForm(UserView user)
{
    //some  data processing over here
    ViewData["choice"] = "Apple";

    return View();
}

If you want to pass a message that will survive after a redirect you could use TempData instead of ViewData.

[HttpPost]
public ActionResult DisplayForm(UserView user)
{
    //some  data processing over here
    TempData["choice"] = "Apple";

    return RedirectToAction("Next", "Account");
}

then inside the Next action you could fetch the data from TempData and store it inside ViewData so that the view can read it.

Respectful answered 10/1, 2012 at 12:57 Comment(2)
ohh so I need to write return View("Next","Account") as per my code right if I am not redirecting ?Polity
@ParthDoshi, yes, if you want to use ViewData directly. But if you want to keep the Redirect-After-Post pattern you could use TempData as shown in my answer.Respectful
M
2

You are performing a post - redirect - get. The ViewData is being set for this request, which returns a redirect, clearing the ViewData, then another request happens which does not have the data. Use TempData instead and it will be added to the ViewData automatically on the next request.

Megan answered 10/1, 2012 at 13:0 Comment(1)
Thanks! Sometimes I feel StackOverflow should allow us to accept two answers, one primary and the other as a secondary answer. Although, I got an answer from another user, I felt your answer was also good enough for me to understand the mistake in my code, so thanks for the quick replyPolity

© 2022 - 2024 — McMap. All rights reserved.