asp.net-mvcsession-variables

What is the right time for ViewData, ViewBag, Session, TempData


I was editing a project and I saw a Session[""] in one controller method and TempData[""] in another. Is there a difference between the 4 or is it just 4 ways to do the same thing?


Solution

  • Example:

    public ActionResult Index()
    {
        ViewData["foo"] = "bar";
        return View();
    }
    

    and inside the view you could use this value:

    <div>@ViewData["foo"]</div>
    

    Same with ViewBag but it is dynamic:

    public ActionResult Index()
    {
        ViewBag.foo = "bar";
        return View();
    }
    

    and inside the view you could use this value:

    <div>@ViewBag.foo</div>
    

    So as you can see ViewData/ViewBag are just an alternative way to pass information to a view from a controller action compared to the classic and recommended way which is using a view model:

    public class MyViewModel
    {
        public string Foo { get; set; }
    }
    

    and then:

    public ActionResult Index()
    {
        var model = new MyViewModel { Foo = "bar" };
        return View(model);
    }
    

    and inside your strongly typed view:

    @model MyViewModel
    <div>@Html.DisplayFor(x => x.Foo)</div>
    

    As you can see using view models provide a strongly typed approach in passing information to a view from a controller action.

    Example:

    public ActionResult Foo()
    {
        TempData["foo"] = "bar";
        return RedirectToAction("bar");
    }
    
    public ActionResult Bar()
    {
        var value = TempData["foo"] as string;
        // use the value here. If you need to pass it to the view you could
        // use ViewData/ViewBag (I can't believe I said that but I will leave it for the moment)
        return View();
    }
    

    ASP.NET MVC will automatically expire the value that was stored in TempData once you read it. Under the covers ASP.NET MVC persists the information into the Session.