2011-09-23 17 views
5

mam sterownik logiczny, którego wyszukuje: wartość sesjiMVC 3 Session.Abandon() wywołane przed ustawieniem TempData [ „myvalue”] = „bla” powoduje kolejną regulatorowi TempData NULL

//checks value null etc.. for existing record in session memory. 
Session["certnum"] 

Następnie w sterowniku ja zdecydowaliśmy się na stan, w którym:

//is called to initiate a New Record that will be created. 
Session.Abandon(); 

jednak w kodowaniu procesowego jest Session.Abandon(); pojawia się przed utworzeniem TempData ["myobject"] = "foo", a po przejściu przez kod TempData w bezpośrednim oknie pokazuje moją wartość i wszystko wydaje się dobre. Następnie po przekierować do innego kontrolera:

return RedirectToAction("ChildInfo", "NewRecord"); 

Ta metoda ChildInfo nie ma już wartość TempData ... Teraz to jest null. Metoda Odejścia z Sezonu została wywołana przed ustaleniem wartości TempData, nie jest pewna, czy jest to błąd z Sesjami MVC, ale dla mnie to nie ma sensu. Jeśli tworzę nową sesję wagi TempData, to powinna ona być kontynuowana do następnego kontrolera. Jeśli usunę metodę Session.Abandon(), wartość TempData będzie działać tak, jak poprzednio.

+0

Ważne jest to, że TempData opiera się na sesji. Sesja zniknęła, a TempData zniknęła. –

+0

@Adam Tak Zdaję sobie sprawę, że jednak wywołuję Session.Abandon() przed utworzeniem wartości TempData, jestem w tej samej metody działania kontrolera, ale nadal wydaje mi się to szalone. –

+0

dlaczego byłby szalony? resetujesz obiekt wymagany do tempdata. To jest tak, jakby powiedzieć "Usuwam wszystkie wiersze w tabeli, ale nie rozumiem, dlaczego na następnej prośbie wiersz, którego mam zamiar zażądać, nie istnieje?" :) –

Odpowiedz

11

Metoda Session.Abandon() czyści bieżącą sesję na końcu żądania, że ​​jest to, do czego jest przeznaczona.

Zobacz http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.abandon.aspx

Jeśli chcesz przekierować do innego działania, trzeba zrobić, aby wywołać przekierowanie jak masz zrobić. Jeśli użyjesz Abandon(), żądanie otrzyma nowy identyfikator sesji.

Jeśli chcesz usunąć coś z sesji trzeba użyć Session.Remove lub Session.RemoveAll metod (również Clear mogą być wykorzystywane do tego samego jako RemoveAll Robi się to przez:.

Session.Remove(itemToRemove); 

lub

Za pomocą jednej z tych dwóch opcji można usunąć niektóre lub wszystkie wcześniej zapisane dane z sesji bez faktycznego powodowania ponownego wygenerowania identyfikatora sesji przy następnym żądaniu.

+0

Dziękuję Bernie! –

1

Metoda Session.Abandon nie usuwa obiektu sesji, jedynie zaznacza, że ​​nie powinien być przechowywany. Obiekt sesji pozostaje nienaruszony podczas bieżącego żądania.

Po zakończeniu odpowiedzi obiekt sesji zostaje przerwany, aby przy następnym wyświetleniu żądania przez przeglądarkę serwer musiał ustawić nowy obiekt sesji. Wszystko, co umieścisz w obiekcie sesji podczas tego całego żądania, zniknie, gdy obiekt sesji zostanie przerwany.

Po przekierowaniu strona przekierowania jest wysyłana jako odpowiedź do przeglądarki, która następnie żąda nowej strony. Jeśli zaznaczysz obiekt sesji, który ma zostać porzucony, a następnie przekierujesz, nowa strona otrzyma nowy obiekt sesji.

+0

Teraz rozumiem. Dzięki, Guffa. –

0

Tak to powinno działać.

Session.Abandon nie zabija sesji natychmiast. Trwa do końca strony. Następnie po załadowaniu następnej strony zostanie utworzona nowa sesja.

+0

Dzięki! Doceniam to –

Powiązane problemy