Ricerca…


introduzione

ViewData e ViewBag vengono utilizzati per trasferire dati dal controllore per visualizzare.

ViewData non è altro che un dizionario di oggetti ed è accessibile tramite stringa come chiave.

ViewBag è molto simile a ViewData. ViewBag è una proprietà dinamica. ViewBag è solo un wrapper attorno al ViewData.

TempData conserva i dati per il tempo della richiesta HTTP, il che significa che contiene dati tra due richieste consecutive. TempData ci aiuta a trasferire i dati tra i controller o tra le azioni. Utilizza internamente la sessione.

Sintassi

  1. ViewData [chiave] = valore;

  2. ViewBag.Key = valore;

  3. TempData [chiave] = valore;

Cosa sono ViewData, ViewBag e TempData?

ViewData è il meccanismo che consente a un controller di fornire dati alla vista che presenta, senza utilizzare ViewModel. In particolare, ViewData è un dizionario disponibile sia nei metodi di azione MVC che nelle viste. È possibile utilizzare ViewData per trasferire alcuni dati dal metodo di azione alla vista restituita dal metodo di azione.

Poiché si tratta di un dizionario, è possibile utilizzare il dizionario come la sintassi per impostare e ottenere dati da esso.

ViewData[key] = value; // In the action method in the controller

Ad esempio, se si desidera passare un messaggio di stringa dal metodo di azione Indice alla vista indice Index.cshtml , è possibile farlo.

public ActionResult Index()
{
   ViewData["Message"] = "Welcome to ASP.NET MVC";
   return View(); // notice the absence of a view model
}

Per accedere a questo nella vista Index.cshtml , è sufficiente accedere al dizionario ViewData con la chiave utilizzata nel metodo di azione.

<h2>@ViewData["Message"]</h2>

ViewBag è l'equivalente dinamico del dizionario ViewData non tipizzato. Sfrutta il tipo dynamic C # per l'esperienza dello zucchero sintattico.

La sintassi per l'impostazione di alcuni dati in ViewBag è

ViewBag.Key = Value;

Quindi se vogliamo passare la stringa del messaggio nel nostro esempio precedente usando ViewBag, lo sarà

public ActionResult Index()
{
   ViewBag.Message = "Welcome to ASP.NET MVC";
   return View(); // not the absence of a view model
}

e nella vista Indice,

<h2>@ViewBag.Message</h2>

I dati non sono condivisi tra ViewBag e ViewData. ViewData richiede il typecasting per ottenere dati da tipi di dati complessi e controllare valori nulli per evitare errori laddove View Bag non richiede tipizzazione.

È possibile utilizzare TempData quando si desidera mantenere i dati tra una richiesta http e la successiva richiesta HTTP. La durata dei dati memorizzati in TempDataDictionary termina dopo la seconda richiesta. Quindi TempData è utile negli scenari in cui stai seguendo il modello PRG.

[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
}

Quando return RedirectToAction("SomeActionMethod") , il server invierà una risposta 302 al client (browser) con il valore dell'intestazione dell'ubicazione impostato sull'URL su "SomeActionMethod" e il browser farà una richiesta totalmente nuova a tale. ViewBag / ViewData non funzionerà in tal caso per condividere alcuni dati tra queste 2 chiamate. È necessario utilizzare TempData in tali scenari.

TempData ciclo di vita

I dati salvati su TempData vengono memorizzati nella sessione e verranno automaticamente rimossi alla fine della prima richiesta a cui si accede ai dati. Se non viene mai letto, verrà conservato fino alla fine della lettura o alla scadenza della sessione.

L'utilizzo tipico sembra la seguente sequenza (in cui ogni riga è invocata da una richiesta diversa):

//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

Questo comportamento può essere un ulteriore controller con i metodi Peek e Keep .

  • Con Peek puoi recuperare i dati memorizzati in TempData senza contrassegnarli per la cancellazione, quindi i dati saranno ancora disponibili su una richiesta futura

    //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"];
    
  • Con Keep puoi specificare che una chiave che è stata contrassegnata per la cancellazione dovrebbe essere effettivamente mantenuta. In questo caso il recupero dei dati e il salvataggio dalla cancellazione richiedono 2 chiamate al metodo:

    //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"];
    

Con questo in mente, usa Peek quando vuoi sempre mantenere il valore per un'altra richiesta e usa Keep quando il mantenimento del valore dipende da una logica aggiuntiva.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow