2012-05-27 2 views
9

Ich habe versucht, eine Website als Sitzung weniger zu machen. Fügen Sie also <sessionState mode="Off" /> zu meiner web.config hinzu. Danach, wenn ich ausführenVerwenden von TempData während <sessionState mode = "Aus" />

Session["test"] = "yes"; 

ich einen Fehler „Objektverweis gesetzt nicht auf eine Instanz eines Objekts erhalten. "Das ist in Ordnung.

Aber mit dieser Konfiguration kann ich

TempData["test"] = "yes"; 

in Controller und drucken TempData["test"]; in Ansicht Seite gesetzt. Es funktioniert gut.

Gemäß MSDN "Der TempData-Eigenschaftswert wird im Sitzungszustand gespeichert".

Also, wenn ich <sessionState mode="Off" /> erwähne, wie TempData funktioniert? Wird in ASP.NET TempData noch in der Sitzung oder an einem anderen Ort gespeichert?

Antwort

16

Dies funktioniert nur mit deaktiviertem Sitzungsstatus, wenn Sie während derselben Anfrage TempData["test"] in derselben Ansicht drucken. Daher wird dieser Wert aus dem TempData-Wörterbuch entfernt und MVC versucht nicht, den Sitzungsstatus zu speichern. Probieren Sie es aus Ihrer Sicht zu entfernen, und Sie werden System.InvalidOperationException: The SessionStateTempDataProvider class requires session state to be enabled.

Sie erhalten individuell Sitzungsstatus für Ihre Controller deaktivieren, indem Sie das Hinzufügen [SessionState(SessionStateBehavior.Disabled)] Attribut oder Umsetzung Ihrer eigenen TempData Provider ITempDataProvider Schnittstelle.

[EDIT] Nur meine ersten Punkt zu erklären, lassen Sie uns zwei Situationen vorstellen:

  • Sie haben Controller-Aktion, die einen gewissen Wert zu TempData["test"] und eine entsprechende Ansicht zuordnet, die von dieser Aktion und druckt diese Daten zurückgegeben wird . In diesem Fall wird alles ohne einen Sitzungsstatus funktionieren, da TempData["test"] zwischen Anforderungen nicht gespeichert werden muss.
  • Sie haben eine Controlleraktion, die TempData["test"] einen Wert zuweist, aber Benutzer zu einer anderen Aktion mit einer eigenen Ansicht umleitet, die diese Daten druckt. In diesem Fall funktioniert es nicht, wenn der Sitzungsstatus deaktiviert ist, da MVC den Wert TempData["test"] zwischen zwei Anforderungen speichern muss.
+0

Ich verstehe über ITempDataProvider und danke dafür. Ich fand auch, dass Sie anstelle der Sitzung von hier aus temporäre Daten in Cookies aufbewahren können. http://afana.me/post/session-less-controllers-and-TempData-ASPNET-MVC.aspx. –

+0

Ja, der Typ hat seinen eigenen TempData-Provider implementiert, der auf Cookies basiert. –

+0

Wir verwenden TempData für einzelne Anfrage richtig? Also legen wir den Wert für TempData im Controller fest und rufen die View-Seite auf. Ich habe noch einen Zweifel über "Versuchen Sie, es aus Ihrer Sicht zu entfernen und Sie werden einen Fehler bekommen". Kannst du das bitte erklären? –