[MVC] ViewData, TempData en ViewBag

In MVC zijn er verschillende manieren om data van de Controller in de view te krijgen. Eén mogelijkheid is om gebruik te maken van ViewData, TempData of de ViewBag. Het was niet geheel duidelijk wat nu precies het verschil is tussen deze datahouders, dus heb ik het even uitgezocht. ViewData wordt gebruikt in één controller en kan vervolgens weer worden opgevraagd vanuit de View. Als er in de controller een redirect zou plaatsvinden naar een andere action, dan verliest ViewData zijn waarde.
public ActionResult Create()
{
  // Sla waarde op in ViewData
  ViewData["Error"] = "Fout opgetreden bij het het aanmaken van ...";

  // Redirect naar de index
  return RedirectToAction("Index");
} 

public ActionResult Index()
{
  // De variabele error is leeg
  var error = ViewData["Error"];
} 
De ViewBag is geïntroduceerd in MVC 3 en heeft dezelfde eigenschappen als de ViewData (na een redirect is het weer een leeg object). Het gebruik van de ViewBag is wel anders. De ViewBag maakt namelijk gebruik van het dynamic keyword, geïntroduceerd in .NET 4. Dit betekent dat je runtime properties kan toevoegen aan een object en deze een waarde kan geven. Vanwege deze mogelijkheid is het niet meer nodig om objecten die in de ViewBag worden gestopt te casten.
/* In de controller */
public ActionResult Index()
{
  var List persons = _repository.GetAllPersons();

  ViewBag.Persons = persons;

  return View();
} 

/* In de view */
// De objecten in de ViewBag hoeven nu niet gecast te worden naar Person. Dit zou wel hebben gemoeten bij het gebruik van ViewData
foreach(var person in ViewBag.Persons)
{
   Response.Write(person.FullName);
}
TempData werkt bijna hetzelfde als ViewData, maar met één belangrijk verschil, namelijk dat TempData wel zijn waarden blijft houden na een redirect. Op de achtergrond maakt TempData namelijk gebruik van een Session om zijn data in om te slaan.
public ActionResult Create()
{
  // Sla waarde op in TempData
  TempData["Error"] = "Fout opgetreden bij het het aanmaken van ...";

  // Redirect naar de index
  return RedirectToAction("Index");
} 

public ActionResult Index()
{
  // De variabele error is niet leeg en bevat dus 'Fout opgetreden bij het het aanmaken van ...'
  var error = TempData["Error"];
} 
Bronnen:
http://brendan.enrick.com/post/Difference-Between-ViewBag-and-ViewData-in-MVC-3.aspx
http://stackoverflow.com/questions/7993263/viewbag-viewdata-and-tempdata

Reacties

Populaire posts van deze blog

[SQL Server] varchar vs nvarchar

MS Sql 70-461: Chapter 5

[C#] Class serialiseren en deserialiseren