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

  1. ViewData [key] = waarde;

  2. ViewBag.Key = waarde;

  3. 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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow