TempData wird nicht gelöscht

8

Ich arbeite an einer ASP.NET MVC 3-Webanwendung, wo ich TempData verwenden, um ein Modellobjekt in dem Szenario zu speichern, in dem der Benutzer nicht angemeldet ist.

Hier ist der Ablauf:

  1. Verwenden Sie das Formular.
  2. Code (spezieller Aktionsfilter) fügt TempData ein Modell hinzu und leitet zur Anmeldeseite um.
  3. Der Benutzer wurde zurück zur GET-Aktion geleitet, die TempData liest und die POST-Aktion direkt aufruft

Nach Schritt 3 hätte ich gedacht, TempData würde gelöscht werden?

Hier ist der Code:

%Vor%

Ich habe diesen Artikel gefunden, der besagt:

  1. Elemente werden erst am Ende einer Anfrage aus TempData entfernt, wenn sie zum Entfernen markiert wurden.
  2. Elemente werden nur zum Entfernen markiert, wenn sie gelesen werden.
  3. Elemente können durch den Aufruf von TempData.Keep (key) nicht markiert werden.
  4. RedirectResult und RedirectToRouteResult rufen immer TempData.Keep ().
  5. auf

Nun, indem Sie es mit TempData["xxx"] lesen, ist das nicht ein "Lesen" und daher sollten sie zum Entfernen markiert werden?

Und der letzte betrifft mich etwas - da ich nach dem POST eine Umleitung mache (P-R-G). Aber das kann nicht vermieden werden.

Gibt es eine Möglichkeit, dass ich sage "trenne diesen Gegenstand". TempData.Entfernen? Oder mache ich das falsch?

    
RPM1984 03.10.2011, 02:57
quelle

3 Antworten

9

Wurde behoben, indem TempData.Remove direkt nach dem Lesen hinzugefügt wurde.

Nicht wirklich glücklich darüber. Ich dachte, der ganze Punkt von TempData wäre, dass ich das nicht tun müsste

Verwenden Sie Session auch direkt.

    
RPM1984 03.10.2011, 03:05
quelle
6

Hier sind 2 GET HTTP-Anfragen beteiligt: ​​

  1. Die erste Anfrage wird vom Client gesendet und ist diejenige, die etwas in TempData speichert
  2. Am Ende der ersten Anfrage sendet der Client eine zweite HTTP-Anfrage zum Abrufen der Anmeldeseite.

In Ihrem Szenario ist keine POST-Anfrage enthalten. Die Tatsache, dass Sie von Ihrer GET Foo-Aktion die POST Foo-Aktion aufrufen, bedeutet nicht, dass eine separate Anforderung ausgeführt wird (Sie befinden sich immer noch im Kontext der anfänglichen GET-Anforderung). Es ist nur ein C # -Methodenaufruf, keine separate Anfrage.

Sie speichern während der ersten Anfrage etwas in TempData, und dieses TempData steht für das zweite zur Verfügung. Es wird also in der Controller-Aktion verfügbar sein, die die Anmeldeseite rendert.

Daher müssen Sie in TempData in Aktion lesen, indem Sie die Anmeldeseite rendern, wenn TempData entfernt werden soll.

    
Darin Dimitrov 03.10.2011 06:02
quelle
3

Nachfolgend sind einige der wichtigsten Punkte aufgeführt, die bei der Verwendung von Temp-Daten zu beachten sind.

1) Bei einem Lesezugriff auf temporäre Daten werden Elemente nicht sofort aus dem Wörterbuch entfernt, sondern nur zum Löschen.

2) Temporäre Daten entfernen nicht immer das Element, auf das zugegriffen wurde. Es entfernt nur das Element, wenn eine Aktion zu einem HTTP-200-Statuscode führt (ViewResult / JsonResult / ContentResult usw.).

3) Im Falle von Aktionen, die zu einer Http 302 führen (wie etwa bei Umleitungsaktionen), werden die Daten auch dann gespeichert, wenn auf sie zugegriffen wird.

    
Kiran Vedula 16.05.2015 01:22
quelle