asp.net-mvc
ViewData, ViewBag, TempData
Zoeken…
Invoering
ViewData
en ViewBag
worden gebruikt om gegevens van de controller over te dragen om te bekijken.
ViewData is niets anders dan een woordenboek van objecten en is per string als sleutel toegankelijk.
ViewBag lijkt erg op ViewData. ViewBag is een dynamische eigenschap. ViewBag is slechts een verpakking rond de ViewData.
TempData bewaart gegevens gedurende de tijd van HTTP Request, wat betekent dat het gegevens tussen twee opeenvolgende aanvragen bewaart. TempData helpt ons om gegevens over te dragen tussen controllers of tussen acties. Gebruikt intern sessie.
Syntaxis
ViewData [key] = waarde;
ViewBag.Key = waarde;
TempData [key] = waarde;
Wat zijn ViewData, ViewBag en TempData?
ViewData is het mechanisme voor een controller om gegevens te leveren aan de weergave die hij presenteert, zonder een ViewModel te gebruiken. ViewData is met name een woordenboek dat beschikbaar is in zowel MVC-actiemethoden als views. U kunt ViewData gebruiken om bepaalde gegevens van uw actiemethode over te dragen naar de weergave die door de actiemethode wordt geretourneerd.
Omdat het een woordenboek is, kunt u het woordenboek als syntax gebruiken om gegevens in te stellen en op te halen.
ViewData[key] = value; // In the action method in the controller
Als u bijvoorbeeld een stringbericht van uw Index- Index.cshtml
wilt doorgeven aan uw Index-weergave Index.cshtml
, kunt u dit doen.
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC";
return View(); // notice the absence of a view model
}
Om hier toegang toe te krijgen in uw Index.cshtml
weergave, kunt u eenvoudig het ViewData-woordenboek openen met de sleutel die in de Index.cshtml
gebruikt.
<h2>@ViewData["Message"]</h2>
ViewBag is het dynamische equivalent van het ongetypeerde ViewData-woordenboek. Het maakt gebruik van het C # dynamic
type voor syntactische suikerervaring.
De syntaxis voor het instellen van sommige gegevens op ViewBag is
ViewBag.Key = Value;
Dus als we de berichtstring in ons vorige voorbeeld met ViewBag willen doorgeven, is dat zo
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC";
return View(); // not the absence of a view model
}
en in uw indexweergave,
<h2>@ViewBag.Message</h2>
Gegevens worden niet gedeeld tussen de ViewBag en de ViewData. ViewData vereist typecasting om gegevens van complexe datatypes te verkrijgen en op nulwaarden te controleren om fouten te voorkomen, aangezien View Bag geen typecasting vereist.
TempData kan worden gebruikt wanneer u gegevens tussen het ene http-verzoek en het volgende HTTP-verzoek wilt bewaren . De levensduur van gegevens die zijn opgeslagen in TempDataDictionary eindigt na het tweede verzoek. TempData is dus nuttig in scenario's waarin u het PRG-patroon volgt.
[HttpPost]
public ActionResult Create(string name)
{
// Create a user
// Let's redirect (P-R-G Pattern)
TempData["Message"] = "User created successfully";
return RedirectToAction("Index");
}
public ActionResult Index()
{
var messageFromPreviousCall = TempData["Message"] as String;
// do something with this message
// to do : Return something
}
Wanneer we return RedirectToAction("SomeActionMethod")
, stuurt de server een 302-reactie naar de client (browser) met de locatiekoptekstwaarde ingesteld op de URL naar "SomeActionMethod" en zal de browser daar een volledig nieuw verzoek om doen. ViewBag / ViewData zullen in dat geval niet werken om sommige gegevens tussen deze 2 oproepen te delen. U moet TempData in dergelijke scenario's gebruiken.
TempData levenscyclus
Gegevens die zijn opgeslagen in TempData worden opgeslagen in de sessie en worden automatisch verwijderd aan het einde van het eerste verzoek waar toegang tot de gegevens wordt verkregen. Als het nooit wordt gelezen, wordt het bewaard totdat het eindelijk is gelezen of de sessie een time-out heeft.
Het typische gebruik ziet er als volgt uit (waarbij elke regel wordt aangeroepen vanuit een ander verzoek):
//first request, save value to TempData
TempData["value"] = "someValueForNextRequest";
//second request, read value, which is marked for deletion
object value = TempData["value"];
//third request, value is not there as it was deleted at the end of the second request
TempData["value"] == null
Dit gedrag kan verdere controller zijn met de Peek
and Keep
methoden.
Met
Peek
kunt u gegevens ophalen die zijn opgeslagen in TempData zonder deze te markeren voor verwijdering, zodat gegevens nog steeds beschikbaar zijn op een toekomstig verzoek//first request, save value to TempData TempData["value"] = "someValueForNextRequest"; //second request, PEEK value so it is not deleted at the end of the request object value = TempData.Peek("value"); //third request, read value and mark it for deletion object value = TempData["value"];
Met
Keep
kunt u opgeven dat een sleutel die is gemarkeerd voor verwijdering daadwerkelijk moet worden behouden. In dit geval vereist het ophalen van de gegevens en het opslaan van verwijdering 2 methode-aanroepen://first request, save value to TempData TempData["value"] = "someValueForNextRequest"; //second request, get value marking it from deletion object value = TempData["value"]; //later on decide to keep it TempData.Keep("value"); //third request, read value and mark it for deletion object value = TempData["value"];
Gebruik daarom Peek
wanneer u altijd de waarde voor een ander verzoek wilt behouden en gebruik Keep
wanneer het behouden van de waarde afhankelijk is van aanvullende logica.