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
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);
}
}
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) .
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
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. –
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
.
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
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.
Si dovrebbe scrivere
TempData.Keep("nameofthedata");
nel controller, quindi manterrà i dati in situazioni di aggiornamento troppo.
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").
Si basa sull'accesso al valore ora? Ho perso quel registro delle modifiche. –
Sì, puoi fornire un riferimento per la perdita di TempData al primo tentativo di accesso? – Omar
@Nathan Taylor @Baddie, spero che le mie modifiche e citazioni rimuovano le tue preoccupazioni. – jfar