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.
To summarize, ViewBag and ViewData are used to pass the data from Controller action to View and TempData is used to pass the data from action to another action or one Controller to another Controller.
ViewBag will be slower than ViewData; but probably not enough to warrant concern.
All three objects are available as properties of both the view and controller. As a rule of thumb, you'll use the ViewData, ViewBag, and TempData objects for the purposes of transporting small amounts of data from and to specific locations (e.g., controller to view or between views).
TempData is ideal for short-lived things like displaying validation errors or other messages that we don't need to persist for longer than a single request. Session is ideal choice when we need to persist data for extended periods of time i.e. it is used to store data which is required throughout user session.
dynamic
wrapper around this dictionary. 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
.
ASP.net MVC introduced ViewData, ViewBag, TempData, Session to pass data between controller to view.
ViewData
ViewData is implemented by using ViewDataDictionary class which stored in CurrentRequestContext. So, ViewData life-cycle will end when the current request ends.
ViewBag is also like ViewData, and only difference is it enable dynamically sharing the data using dynamics objects.
TempData is a very short-lived instance, and you should only use it during the current and the subsequent requests only.This will be handy if you want to use Redirections(RedirectToAction, RedirectToRoute, Redirect) in ASP.net MVC and pass some data among redirects. TempData stores data in Session but framework disposes the data when current and subsequent requests ends.
Session is long-lived(Never expires) data that belongs to user session.You need to be mindful when you use session variables which can be easily cause issues.
protected void Session_Start(Object sender, EventArgs e)
{
int userType = 1;
HttpContext.Current.Session.Add("_SessionUserType",userType );
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With