Differenza tra ViewData e TempData?


94

So cos'è ViewData e lo uso sempre, ma in ASP.NET Preview 5 hanno introdotto qualcosa di nuovo chiamato TempData.

Normalmente digito fortemente il mio ViewData, invece di usare l'approccio del dizionario degli oggetti.

Quindi, quando dovrei usare TempData invece di ViewData?

Esistono buone pratiche per questo?


Vorrei aggiungere qualcosa su TempDataqui stackoverflow.com/a/17199709/2015869
Imad Alazani

Risposte:


94

In una frase: TempDatasono come ViewData con una differenza: contengono solo dati tra due richieste successive, dopodiché vengono distrutti. È possibile utilizzare TempDataper passare messaggi di errore o qualcosa di simile.

Sebbene obsoleto, questo articolo ha una buona descrizione del TempDataciclo di vita.

Come ha detto Ben Scheirman qui :

TempData è un dizionario di archiviazione temporanea supportato da una sessione disponibile per una singola richiesta. È fantastico passare messaggi tra i controller.


Penso che sia una differenza piuttosto grande, in quanto TempDataimplicherà qualcosa di potenzialmente molto più complicato (la sessione) di un semplice dizionario che viene passato da un metodo all'altro
Matti Virkkunen

29

Quando un'azione restituisce un risultato RedirectToAction, provoca un reindirizzamento HTTP (equivalente a Response.Redirect). I dati possono essere conservati nella proprietà TempData (dizionario) del controller per la durata di una singola richiesta di reindirizzamento HTTP.


Il valore di ViewData verrà preservato nello stesso caso?
IsmailS

9
@Ismail: No, ViewData non conserverà i dati tramite Redirect. Questa è la principale differenza di TempData.
Mariano Desanze

5

ViewData:

  • ViewData è un tipo di dizionario public ViewDataDictionary ViewData { get; set; }
  • Può essere utilizzato per passare i dati dal controller alla visualizzazione, solo in un modo
  • La vita sta solo durante l'attuale richiesta
  • Se si passa una stringa, non è necessario eseguire il typecast
  • Se si passa un oggetto, è necessario digitarlo, ma prima è necessario verificare se non è nullo
  • È una proprietà su ControllerBase, che è il genitore della Controllerclasse

TempData:

  1. TempDatautilizzare internamente TempDataDictionary:public TempDataDictionary TempData { get; set; }
  2. Una volta salvati i dati TempDataDictionarynell'oggetto:
    • Persiste in esso e può essere letto da qualsiasi vista o qualsiasi azione in qualsiasi controller
    • Può essere letto solo una volta; una volta letto, diventa nullo
    • Viene salvato nella sessione così alla scadenza dei dati della sessione vengono persi.

Questo comportamento è una novità di ASP.NET MVC 2 e versioni successive. Nelle versioni precedenti di ASP.NET MVC, i valori in TempDataerano disponibili solo fino alla richiesta successiva.

  1. È vivo, finché non viene letto o la sessione scade e può essere letto da qualsiasi luogo.

Vedi il confronto di ViewData, ViewBag, TempData e Session in MVC in dettaglio



0

i dati di visualizzazione vengono utilizzati quando si desidera passare i dati dal controller alla visualizzazione corrispondente. i dati di visualizzazione hanno una durata molto breve, significa che verranno distrutti quando si verifica il reindirizzamento. Esempio (controller):

public ViewResult try1()
    {
        ViewData["DateTime"] = DateTime.Now;
        ViewData["Name"] = "Mehta Hitanshi";
        ViewData["Twitter"] = "@hitanshi";
        ViewData["City"] = "surat";
        return View();
    }

try1.cshtm

<table>
<tr>
    <th>Name</th>
    <th>Twitter</th>
    <th>Email</th>
    <th>City</th>
    <th>Mobile</th>
</tr>
<tr>
    <td>@ViewData["Name"]</td>
    <td>@ViewData["Twitter"]</td>
    <td>@ViewData["City"]</td>
</tr>
</table> 

TempData trasferisce i dati tra i controllori o tra le azioni. Viene utilizzato per memorizzare messaggi una tantum e la sua vita è molto breve. Possiamo usare TempData.Keep () per renderlo disponibile attraverso tutte le azioni o per renderlo persistente.

Esempio (controller):

public ActionResult try3()
    {
        TempData["DateTime"] = DateTime.Now;
        TempData["Name"] = "Ravina";
        TempData["Twitter"] = "@silentRavina";
        TempData["Email"] = "Ravina12@gmail.com";
        TempData["City"] = "India";
        TempData["MobNo"] = 9998975436;
        return RedirectToAction("TempView1");
    }
    public ActionResult TempView1()
    {
        return View();
    }

TempView1.cshtm

<table>
<tr>
    <th>Name</th>
    <th>Twitter</th>
    <th>Email</th>
    <th>City</th>
    <th>Mobile</th>
</tr>
<tr>
    <td>@TempData["Name"]</td>
    <td>@TempData["Twitter"]</td>
    <td>@TempData["Email"]</td>
    <td>@TempData["City"]</td>
    <td>@TempData["MobNo"]</td>
</tr>
</table>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.