asp.net-mvc
ViewData, ViewBag, TempData
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
ViewData [chiave] = valore;
ViewBag.Key = valore;
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.