2011-10-03 11 views
8

Pracuję nad aplikacji ASP.NET MVC 3 internetowej, gdzie mogę używać TempData przechowywać obiekt modelu, w sytuacji, w której użytkownik nie jest zalogowanyTempData Nie przejaśniały

Oto przepływu.:

  1. Użyj formularza przesyłającego.
  2. Kod (specjalny filtr akcji) dodaje model do TempData, przekierowuje do strony logowania.
  3. użytkownika przekierowany z powrotem do GET działania, które czyta TempData i wzywa POST działanie bezpośrednio

Po kroku 3, bym TempData myślowe będą wyczyszczone?

Oto kod:

[HttpGet] 
public ActionResult Foo() 
{ 
    var prefilled = TempData["xxxx"] as MyModel; 
    if (prefilled != null) 
    { 
     return Foo(prefilled); 
    } 
} 

[HttpPost] 
[StatefulAuthorize] // handles the tempdata storage and redirect to logon page 
public ActionResult Foo(MyModel model) 
{ 
    // saves to db.. etc 
} 

znalazłem this article który stanowi:

  1. przedmioty są usuwane tylko z TempData na końcu wniosku, jeżeli zostały one oznaczone do usunięcia.
  2. Przedmioty są tylko oznaczone do usunięcia po przeczytaniu.
  3. Przedmioty można odznaczać, wywołując TempData.Keep (klawisz).
  4. RedirectResult i RedirectToRouteResult zawsze wywołują funkcję TempData.Keep().

Cóż, czytając go z TempData["xxx"] nie jest to "czytaj" i dlatego powinny być one oznaczone do usunięcia?

I ostatnia część mnie dotyczy - ponieważ robię przekierowanie po POST (P-R-G). Ale nie można tego uniknąć.

Czy istnieje sposób, aby powiedzieć "porzucić ten przedmiot". TempData.Remove? Czy robię to źle?

+0

Musisz wykonać pełne przekierowanie i nie zwracać drugiej metody działania. Dlatego nie działa. – Buildstarted

+0

@BuildStarted - ale metoda POST * nie * wykonuje przekierowanie po zakończeniu. Nie możesz wykonać przekierowania do metody POST, czy to nie będzie GET? – RPM1984

+0

Cóż, z tego co czytam na podstawie ograniczonych danych wynika, że ​​robisz get i przekierowanie * w kodzie * do posta - że 'StatefulAuthorize' nie będzie wywoływane. – Buildstarted

Odpowiedz

9

Naprawiono przez dodanie TempData.Remove zaraz po przeczytaniu.

Niezbyt się z tego cieszę. Pomyślałem, że cały punkt TempData był taki, że nie musiał tego robić.

Może również używać sesji bezpośrednio.

+0

To nie jest sposób, aby to wyczyścić. Mogłeś używać sesji zamiast TempData. Jedyną zaletą programu TempData jest samodzielne zarządzanie danymi. Jak już wcześniej wspomniałem, wartość jest usuwana tylko wtedy, gdy akcja daje wynik 200 (taki jak ViewResult/ContentResult/JsonResult) we wszystkich innych scenariuszach, a wszelkie działania wynikające z kodu statusu 302 (takie jak RedirectAction) zachowują dane w TempData. Przeczytaj poniżej, aby uzyskać więcej informacji. http://stackoverflow.com/questions/32571599/asp-net-tempdata-isnt-cleared-even-after-reading-it –

6

Istnieją 2 HTTP GET wnioski zaangażowane tutaj:

  1. Pierwszy wniosek jest wysyłany przez klienta i jest ten, który zapisuje coś w TempData
  2. Pod koniec pierwszego wniosku klient wysyła drugie żądanie HTTP, aby pobrać stronę logowania.

W twoim scenariuszu nie ma żądania POST. Fakt, że z akcji GET Foo wywołujesz akcję POST Foo, nie oznacza, że ​​wykonywane jest oddzielne żądanie (nadal jesteś w kontekście początkowego żądania GET). Jest to tylko wywołanie metody C#, a nie oddzielne żądanie.

Przechowujesz coś w TempData podczas pierwszego żądania i ta TempData będzie dostępna dla drugiej. Będzie więc dostępny w akcji kontrolera renderującego stronę logowania.

Musisz więc odczytać z TempData w akcji renderującej stronę logowania, jeśli chcesz, aby TempData została usunięta.

+0

Twoje prawo. Ale nie obchodzi mnie to na stronie logowania. Próbuję zrobić "automatyczny post" po zalogowaniu się, więc nie muszą ponownie przesyłać formularza. Dlatego właśnie "wywołuję" bezpośrednio moją akcję POST (wiem, że nie jest to oddzielna prośba). Więc myślę, że nie powinienem używać TempData, ponieważ jest to 2 żądania później, dla których potrzebuję danych, a nie następnych. – RPM1984

3

Poniżej przedstawiono niektóre kluczowe punkty, o których należy pamiętać podczas korzystania z danych tymczasowych.

1) Dostęp do odczytu do danych tymczasowych nie powoduje natychmiastowego usuwania elementów ze słownika, lecz jedynie znaków do usunięcia.

2) Dane tymczasowe nie zawsze usuwają przedmiot, do którego uzyskano dostęp. Usuwa element tylko wtedy, gdy akcja powoduje kod statusu Http 200 (ViewResult/JsonResult/ContentResult itp.).

3) W przypadku działań, które skutkują Http 302 (takich jak wszelkie działania przekierowania), dane są przechowywane w pamięci, nawet gdy są dostępne.

Powiązane problemy