[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.
http://brendan.enrick.com/post/Difference-Between-ViewBag-and-ViewData-in-MVC-3.aspx
http://stackoverflow.com/questions/7993263/viewbag-viewdata-and-tempdata
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 ListTempData 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.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); }
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
Een reactie posten