2009-05-22 10 views
6

Z tego, co przeczytałem, informacje umieszczone w TempData będą tam dla bieżącego żądania i następnego żądania (aby można było przekazywać informacje przez przekierowania). Problem polega na tym, że jeśli przejdę do akcji kontrolera, która nie przekierowuje, informacja w TempData nadal będzie dostępna dla następnego żądania. Używam TempData do przechowywania wiadomości informacyjnych, które są wyświetlane użytkownikowi, więc teraz otrzymuję wiadomości również dla pierwszego ekranu na drugim ekranie.ASP.NET MVC: czyszczenie TempData po wykonaniu metody kontrolera

Czy jest odpowiedni czas w cyklu życia kontrolera, aby wyczyścić TempData, gdy nie jest już używany?

Odpowiedz

7

Use ViewData instead of TempData if you are not redirecting. Nigdy nie powinieneś ręcznie usuwać TempData. Jeśli używasz go tylko podczas przekierowania, zostanie ono wyczyszczone automatycznie, we właściwym czasie.

+0

Ale co, jeśli moja akcja kontrolera to jest przekierowanie? Nie mogę użyć ViewData w tym przypadku, ponieważ wiadomości już tam nie ma. Czy istnieje lepszy sposób radzenia sobie z takimi komunikatami, niż przechowywanie ich w pliku TempData/ViewData? –

+0

Musisz użyć ViewData, gdy nie przekierowujesz i TempData podczas przekierowywania. W obu przypadkach wszystko inne dzieje się automatycznie. Aby wyświetlić, wpisz: TempData ["key"]? ViewData ["key"] w twoim widoku. –

0

Myślę, że należy używać ViewData, jeśli nie używasz POST-REDIRECT-GET. Ale jeśli naprawdę potrzebujesz zachowanie już opisane powyżej należy utworzyć swój własny TempDataProvider:

public class YourTempDataProvider : SessionStateTempDataProvider 
{ 
    public override void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values) 
    { 
     bool redirecting = ... 

     if(redirecting) 
     { 
      base.SaveTempData(controllerContext, values); 
     } 
    } 
} 
+0

A jak używać tej niestandardowej klasy? – Alex

0

nie będę szukać pewnej tu miejsce, inne niż niestandardowym TempDataProvider. Ale to trudne. A co jeśli chcesz zachować regularne zachowanie w innych kontrolerach? Zrobiłbym to YAGNI na teraz i po prostu wyczyściłem go tam, gdzie jest to potrzebne. Gdy zauważysz wzór, możesz wyciągnąć go do jakiegoś wspólnego miejsca.

Powiązane problemy