2012-10-10 11 views
10

Inserendo un valore in TempData alla prima richiesta in un actionfilter.TempData non distruggerà dopo la seconda richiesta

filterContext.Controller.TempData["value"] = true; 

dopo che una seconda richiesta arriva e io controllare il valore

filterContext.Controller.TempData.ContainsKey("value") 

il valore è lì. Poi una terza richiesta arriva e io controllare il valore di nuovo

filterContext.Controller.TempData.ContainsKey("value") 

e il valore è ancora presente. Non dovrebbe essere questo valore distrutto dopo la seconda richiesta? Tutte le richieste sono richieste AJAX.

risposta

30

Non dovrebbe essere questo valore distrutto dopo la seconda richiesta?

Solo se lo si legge:

var value = filterContext.Controller.TempData["value"]; 

Se non avete letto il valore dal TempData non sarà sfrattato.

Ecco come il getter TempData.Items è definito:

public object get_Item(string key) 
{ 
    object obj2; 
    if (this.TryGetValue(key, out obj2)) 
    { 
     this._initialKeys.Remove(key); 
     return obj2; 
    } 
    return null; 
} 

Notate come il valore verrà sfrattato solo se si chiama il getter e solo se il valore è stato trovato nella collezione. Nel codice che hai mostrato tutto ciò che fai è controllare se il TempData contiene una determinata chiave ma non hai letto il valore di questa chiave.

Si potrebbe sfrattare manualmente il valore TempData se si desidera:

filterContext.Controller.TempData.Remove("value"); 

E c'è anche un metodo che permette di leggere il valore senza rimuoverlo:

var value = filterContext.Controller.TempData.Peek("value");