TempData is a dictionary used in C# MVC to pass data between different controllers or different actions. This feature was first introduced in MVC 1.0. To use this tag, the post must be using C#, MVC, and must be in regards to the use of TempData.
TempData uses Session internally to store its data, but unlike Session variables, TempData will clear itself.
Similarities with ViewData
TempData has some similarities with ViewData. They are both dictionaries that use strings as keys and can store primitives or objects for a value. Live ViewData, it can be used as an alternate to the model to pass data from the controller to the view.
Controller
public ActionResult TempTest()
{
TempData["ContentString"] = "some text";
TempData["ContentInt"] = 1;
TempData["ContentBool"] = true;
TempData["ContentDate"] = DateTime.Now;
TempData["ContentObj"] = new SomeClass
{
SomeProp = "some text"
};
return View();
}
View
<div>
TempData content string: @TempData["ContentString"]
</div>
<div>
TempData content integer: @TempData["ContentInt"]
</div>
<div>
TempData content boolean: @TempData["ContentBool"]
</div>
<div>
TempData content date: @TempData["ContentDate"]
</div>
@{
var tempDataContent = (SomeClass) TempData["ContentObj"];
}
<div>
TempData content object: @tempDataContent.SomeProp
</div>
Result
<div>
TempData content string: some text
</div>
<div>
TempData content integer: 1
</div>
<div>
TempData content boolean: True
</div>
<div>
TempData content date: 4/16/2019 9:50:05 AM
</div>
<div>
TempData content object: some text
</div>
Differences to ViewData
TempData holds onto its data through an entire HTTP request. This means that, unlike ViewData, the data in TempData won't blank out after a redirect.
Controller
public ActionResult TempTest1()
{
TempData["Content"] = "some text";
ViewData["Content"] = "some text";
return RedirectToAction("TempTest");
}
public ActionResult TempTest()
{
return View();
}
View
<div>
TempData content: @TempData["Content"]
</div>
<div>
ViewData content: @ViewData["Content"]
</div>
Result
<div>
TempData content: some text
</div>
<div>
ViewData content:
</div>
Once the HTTP Request is done, TempData gets blanked out, so the next HTTP request that is made will only return null for TempData.
Controller
public ActionResult TempTest()
{
TempData["Content"] = "some text";
return View();
}
public ActionResult TempLifeTest()
{
return View();
}
View - TempTest.cshtml
<div>
TempData content: @TempData["Content"]
</div>
View - TempLifeTest.cshtml
<div>
TempData content: @TempData["Content"]
</div>
Result - TempTest.cshtml
<div>
TempData content: some text
</div>
Result - TempLifeTest.cshtml
<div>
TempData content:
</div>
To have TempData retain it's values for the subsequent request, use TempData.Keep()
Controller
public ActionResult TempTest()
{
TempData["Content"] = "some text";
TempData.Keep();
return View();
}
public ActionResult TempLifeTest()
{
return View();
}
View - TempTest.cshtml
<div>
TempData content: @TempData["Content"]
</div>
View - TempLifeTest.cshtml
<div>
TempData content: @TempData["Content"]
</div>
Result - TempTest.cshtml
<div>
TempData content: some text
</div>
Result - TempLifeTest.cshtml
<div>
TempData content: some text
</div>
You can keep calling TempData.Keep() for as long as you want the data to persist for each successive request.
References