2012-05-27 9 views
9

Stavo cercando di rendere un sito meno di sessione. Quindi aggiungi <sessionState mode="Off" /> al mio web.config. Dopo che se eseguoUtilizzo di TempData mentre <sessionState mode = "Off" />

Session["test"] = "yes"; 

ottengo un errore “riferimento non impostato a un'istanza di un oggetto. "Questo va bene.

Ma con questa configurazione è possibile impostare

TempData["test"] = "yes"; 

nel controller e stampare TempData["test"]; in vista pagina. Funziona bene.

Come da MSDN "Il valore della proprietà TempData è memorizzato nello stato sessione".

Quindi se menziono <sessionState mode="Off" /> come funziona TempData? ASP.NET sta ancora conservando TempData in sessione o da qualche altra parte?

risposta

16

Questo può funzionare con lo stato di sessione disabilitato solo se si stampa TempData["test"] sulla vista durante la stessa richiesta, quindi questo valore viene rimosso dal dizionario TempData e MVC non sta tentando di salvarlo nello stato di sessione. Cercare di rimuoverlo dalla visualizzazione e si otterrà System.InvalidOperationException: The SessionStateTempDataProvider class requires session state to be enabled.

è possibile disattivare singolarmente lo stato della sessione per i controller con l'aggiunta di attributo [SessionState(SessionStateBehavior.Disabled)] o implementare il proprio fornitore di TempData utilizzando ITempDataProvider interfaccia.

[EDIT] Giusto per spiegare il mio primo punto, immaginiamo due situazioni:

  • Dovete azione di controllo che assegna un valore a TempData["test"] e una corrispondente vista che viene restituito da questa azione e stampe questi dati . In questo caso, tutto funzionerà anche senza stato di sessione perché non è necessario memorizzare TempData["test"] tra le richieste.
  • L'azione del controller assegna un valore a TempData["test"] ma reindirizza l'utente a un'altra azione con la propria vista che stampa questi dati. In questo caso non funzionerà con lo stato della sessione disabilitato poiché MVC deve memorizzare il valore TempData["test"] tra due richieste.
+0

Ho capito ITempDataProvider e grazie per questo. Ho anche scoperto che al posto della sessione puoi tenere i dati temporanei nei cookie da qui. http://afana.me/post/session-less-controllers-and-TempData-ASPNET-MVC.aspx. –

+0

Sì, il ragazzo ha implementato il proprio provider TempData basato sui cookie. –

+0

Usiamo TempData per singola richiesta, giusto? Quindi impostiamo il valore per TempData nel controller e apriamo la pagina View. Ho un dubbio su "Prova a rimuoverlo dalla tua vista e riceverai un errore". Puoi spiegarlo per favore? –

Problemi correlati