2010-04-15 9 views
7

Se reindirizzamento a una nuova pagina che passa TempData per inizializzare la pagina funziona correttamente, tuttavia se l'utente preme il pulsante di aggiornamento nel proprio browser, TempData non è più disponibile. Dato questo, c'è qualche situazione in cui TempData potrebbe essere usato in modo affidabile?
O un modo per rimuovere o mitigare il problema degli utenti che si aggiornano?ASP.NET MVC esegue l'aggiornamento del browser rendendo inutilizzabile TempData?

risposta

12

In MVC 1, sì, i dati temporanei vengono persi dopo la richiesta successiva dopo aver memorizzato un tasto.

Con MVC 2, tuttavia, i dati temporanei vengono persi dopo il primo tentativo di accesso.

È sempre possibile utilizzare Session, che TempData utilizza in ogni caso, per risolvere il problema di perdita di dati temporanei che si verificano.

Dal MVC 2 Beta Release Notes:

TempDataDictionary Miglioramenti

Il comportamento del classe TempDataDictionary è stato leggermente modificato per scenari di indirizzo in cui i dati temperatura era sia rimosso prematuramente o persistito più del necessario. Ad esempio, nei casi in cui i dati temperatura era letto nella stessa richiesta in cui è stato impostato, i dati di temperatura persisteva per la richiesta successiva, anche se l'intento era quello di rimuoverlo. In altri casi , i dati temporanei non sono stati mantenuti attraverso più reindirizzamenti consecutivi.

per affrontare questi scenari, la classe TempDataDictionary è stato cambiato in modo che tutte le chiavi sopravvivono a tempo indeterminato fino a quando la chiave viene letta dall'oggetto TempDataDictionary. Il metodo Keep è stato aggiunto a TempDataDictionary per consentire di indicare che il valore non deve essere rimosso dopo la lettura. Il parametro RedirectToActionResult è un esempio in cui il metodo Keep viene chiamato in per conservare tutte le chiavi per la richiesta successiva di .

È inoltre possibile guardare direttamente nella sorgente MVC 2 per vedere questi cambiamenti:

MVC 1:

public object this[string key] { 
     get { 
      object value; 
      if (TryGetValue(key, out value)) { 
       return value; 
      } 
      return null; 
     } 
     set { 
      _data[key] = value; 
      _modifiedKeys.Add(key); 
     } 
    } 

MVC 2:

public object this[string key] { 
     get { 
      object value; 
      if (TryGetValue(key, out value)) { 
       _initialKeys.Remove(key); 
       return value; 
      } 
      return null; 
     } 
     set { 
      _data[key] = value; 
      _initialKeys.Add(key); 
     } 
    } 
+0

Si basa sull'accesso al valore ora? Ho perso quel registro delle modifiche. –

+0

Sì, puoi fornire un riferimento per la perdita di TempData al primo tentativo di accesso? – Omar

+0

@Nathan Taylor @Baddie, spero che le mie modifiche e citazioni rimuovano le tue preoccupazioni. – jfar

-1

TempData esiste specificamente per negozio i dati per un solo caricamento/azione/reindirizzamento di una pagina. Se i dati persistono dopo un aggiornamento, è necessario inserirlo nella raccolta ViewData a condizione che l'azione che sta servendo la richiesta di aggiornamento sia la stessa richiesta inizialmente (ovvero il valore ViewData non è stato aggiunto prima di un reindirizzamento) .

+3

La tua dichiarazione sulla persistenza dei dati utilizzando ViewData non è corretta. L'ambito di ViewData termina quando viene generata la vista. L'aggiornamento ripete semplicemente l'azione e ViewData viene rigenerato, nulla persiste. – Omar

+0

Forse ho oscurato il mio significato con come l'ho spiegato. Stavo insinuando che il valore sarebbe stato aggiunto nuovamente a ViewData tramite un aggiornamento. –

0

Le uniche funzioni che possono risolvere il problema sono Cache e Session.

ViewData essenzialmente "muore" fuori quando viene generata la vista.

Se è possibile fornire ulteriori dettagli su ciò che si sta tentando di realizzare, forse un'altra soluzione può essere data, tuttavia, sembra che l'opzione migliore per voi è quella di utilizzare Session o Cache.

+0

Alla fine ho adottato un approccio completamente diverso e ho passato i dati sulla stringa di query (erano solo un paio di variabili ma non ancora la soluzione più elegante) – Myster

2

Una soluzione alternativa per la situazione data in MVC1 sarebbe quella di riassegnare il TempData nel secondo controller pure. Ovviamente persiste i dati nel sistema per un po 'più di tempo. ma corregge il problema di aggiornamento.

+0

Questa soluzione alternativa è applicabile anche a MVC2? – Myster

+2

dovrebbe funzionare anche in MVC2. Ma non sono sicuro delle implicazioni in quanto potrebbe persistere indefinitamente se non leggere di nuovo. – ravi

18

Si dovrebbe scrivere

TempData.Keep("nameofthedata"); 

nel controller, quindi manterrà i dati in situazioni di aggiornamento troppo.

1

I tempdata vengono utilizzati attraverso i reindirizzamenti, quindi se si sta aggiornando la pagina significa che si sta facendo una richiesta separata al server, ecco perché i dati vengono persi. Per mantenere questo tipo di dati, chiama il metodo Tempdata.Keep ("KeyofTempdata") nell'azione a cui stai reindirizzando. Se si desidera rimuovere i dati, utilizzare Tempdata.Remove ("KeyofTempdata").

Problemi correlati