ViewBag, ViewData, TempData, Session - how and when to use them?

31,844

ViewBag, ViewData, TempData, Session - how and when to use them?

ViewBag

Avoid it. Use a view model when you can.

The reason is that when you use dynamic properties you will not get compilation errors. It's really easy to change a property name by accident or by purpose and then forget to update all usages.

If you use a ViewModel you won't have that problem. A view model also moves the responsibility of adapting the "M" (i.e. business entities) in MVC from the controller and the view to the ViewModel, thus you get cleaner code with clear responsibilities.

Action

public ActionResult Index()
{
    ViewBag.SomeProperty = "Hello";
    return View();
}

View (razor syntax)

@ViewBag.SomeProperty

ViewData

Avoit it. Use a view model when you can. Same reason as for ViewBag.

Action

public ActionResult Index()
{
    ViewData["SomeProperty"] = "Hello";
    return View();
}

View (razor syntax):

@ViewData["SomeProperty"]

Temp data

Everything that you store in TempData will stay in tempdata until you read it, no matter if there are one or several HTTP requests in between.

Actions

public ActionResult Index()
{
    TempData["SomeName"] = "Hello";
    return RedirectToAction("Details");
}


public ActionResult Details()
{
    var someName = TempData["SomeName"];
}
Share:
31,844
Adam Bielecki
Author by

Adam Bielecki

Passionate about programming since I was 15. Currently working as a Software Engineer. Also interested in 3d modeling (blender) and game designing UDK, Unity3d. My recent work can be seen at my website.

Updated on July 15, 2022

Comments

  • Adam Bielecki
    Adam Bielecki almost 2 years

    ViewData and ViewBag allows you to access any data in view that was passed from controller.

    The main difference between those two is the way you are accessing the data. In ViewBag you are accessing data using string as keys - ViewBag[“numbers”] In ViewData you are accessing data using properties - ViewData.numbers.

    ViewData example

    CONTROLLER

     var Numbers = new List<int> { 1, 2, 3 };
    
              ViewData["numbers"] = Numbers;
    

    VIEW

    <ul>
     @foreach (var number in (List<int>)ViewData["numbers"])
     {
         <li>@number</li> 
     }
    
     </ul>
    

    ViewBag example

    CONTROLLER

     var Numbers = new List<int> { 1, 2, 3 };
    
             ViewBag.numbers = Numbers;
    

    VIEW

    <ul>
    
    @foreach (var number in ViewBag.numbers)
    
    {
    <li>@number</li> 
    }
    
    </ul>
    

    Session is another very useful object that will hold any information.

    For instance when user logged in to the system you want to hold his authorization level.

    // GetUserAuthorizationLevel - some method that returns int value for user authorization level.
    
    Session["AuthorizationLevel"] = GetUserAuthorizationLevel(userID);
    

    This information will be stored in Session as long as user session is active. This can be changed in Web.config file:

    <system.web>
        <sessionState mode="InProc" timeout="30"/>
    

    So then in controller inside the action :

     public ActionResult LevelAccess()
         {
             if (Session["AuthorizationLevel"].Equals(1))
             {
                 return View("Level1");
             }
    
            if (Session["AuthorizationLevel"].Equals(2))
            {
                return View("Level2");
            }
    
            return View("AccessDenied");
        }
    

    TempData is very similar to ViewData and ViewBag however it will contain data only for one request.

    CONTROLLER

    // You created a method to add new client.

    TempData["ClientAdded"] = "Client has been added";
    

    VIEW

    @if (TempData["ClientAdded"] != null)
    { 
       <h3>@TempData["ClientAdded"] </h3>
    }
    

    TempData is useful when you want to pass some information from View to Controller. For instance you want to hold time when view was requested.

    VIEW

    @{
    TempData["DateOfViewWasAccessed"] = DateTime.Now;
    }
    

    CONTROLLER

    if (TempData["DateOfViewWasAccessed"] != null)
       {
        DateTime time = DateTime.Parse(TempData["DateOfViewWasAccessed"].ToString()); 
       }
    
  • Tommy
    Tommy about 11 years
    "When you need to persist information over several requests" - I am thinking TempData is only good until it is read. I think the use of several request here is a little misleading.
  • jgauffin
    jgauffin about 11 years
    What I mean is that it stays in the temp data until you read it, no matter if it's two requests or 10 in between. But I get your point and will elaborate.
  • Adam Bielecki
    Adam Bielecki about 11 years
    Thanks, I used TempData in my application very often, but I thought it will stay only for one request, not unless you read it. So we can say that it's a bit similar to session, but data can be read only once.
  • Shimmy Weitzhandler
    Shimmy Weitzhandler about 5 years
    Would be nice if you add a section that explains 'Sessions' as well.