2012-04-10 16 views
6

Mam zmienną sesji ustawioną w mojej aplikacji MVC. Za każdym razem, gdy sesja wygasa, a użytkownik próbuje odświeżyć stronę, na której się znajduje, strona wyświetli błąd, ponieważ sesja nie jest już ustawiona.Ekwiwalent MVC Page_Load

Czy mogę gdziekolwiek sprawdzić, czy sesja została ustawiona przed załadowaniem widoku? Być może wstawienie czegoś do pliku Global.asax?

Mogłem zrobić coś takiego na początku KAŻDEGO ActionResult.

public ActionResult ViewRecord() 
{ 
    if (MyClass.SessionName == null) 
    { 
     return View("Home"); 
    } 
    else 
    { 
     //do something with the session variable 
    } 
} 

Czy jest jakaś alternatywa dla zrobienia tego? Jaka byłaby najlepsza praktyka w tym przypadku?

+1

Trzeba filtru niestandardowego działania, niektóre więcej informacji http: // msdn .microsoft.com/pl-us/gg618482 –

+0

Podobna dyskusja tutaj: http://forums.asp.net/t/1287687.aspx –

+0

Oprócz komentarza @ ChrisDiver, jeśli potrzebujesz go zastosować do wszystkich kontrolerów/akcji możesz udekorować kontroler bazowy, z którego dziedziczą wszystkie inne kontrolery. – Chris

Odpowiedz

0

Najpierw powinieneś przekierować do strony głównej, nie zwracać widoku głównego, w przeciwnym razie masz dziwną sytuację na stronie głównej, mimo że URL jest gdzieś indziej.

Po drugie, sesja nigdy nie będzie miała wartości Null, ponieważ nowa sesja zostanie utworzona po wygaśnięciu lub zresetowaniu starej. Zamiast tego sprawdziłeś swoją zmienną i jeśli jest ona zerowa, to wiesz, że sesja jest nowa.

Po trzecie, jeśli aplikacja zależy od danych sesji, to w ogóle nie skorzystam z sesji. Czy używasz tego do buforowania danych? Jeśli tak, to lepszym rozwiązaniem może być użycie pamięci podręcznej (aplikacja otrzyma powiadomienie, gdy elementy pamięci podręcznej wygasną). Jest to prawdopodobnie numer The XY Problem. Masz problem i uważasz, że sesja rozwiązuje twój problem, ale masz inny problem z sesją, więc pytasz, jak rozwiązać problem z sesją, a nie jak rozwiązać problem, który próbuje rozwiązać sesja.

Jaki jest prawdziwy problem, który próbujesz rozwiązać za pomocą tego?

EDIT:

oparciu o swój komentarz poniżej, dlaczego nie można przekazać numer klienta na adres URL:

http://website/Controller/ViewRecord/3 

public ActionResult ViewRecord(int id) 
{ 
    // do whatever you need to do with the customer ID 
} 
+0

Aplikacja internetowa umożliwia wyszukiwanie klienta. Wybieramy klienta na podstawie jego numeru identyfikacyjnego. Ustalam, że numer identyfikacyjny ma sesję.Tutaj jest gdzie to zrobić pod adresem: '\t \t publicznego statycznego łańcucha CIF \t \t { \t \t \t dostać \t \t \t { \t \t \t \t if (HttpContext.Current.Session [ "CIF"] == null) \t \t \t \t \t return ""; . \t \t \t \t inny \t \t \t \t \t powrotu HttpContext.Current.Session [ "cif"] ToString(); \t \t \t} \t \t \t zestaw {HttpContext.Current.Session [ "cif"] = wartość; } \t } '- Następnie w widoku, wzywam MyClass.CIF, aby uzyskać wartość sesji. – Turp

+0

@Turp - Dlaczego musisz dodać klienta do sesji? Dlaczego po prostu nie podać numeru klienta w adresie URL? Następnie wartość nie jest przechowywana w sesji i znika, gdy nie jest już potrzebna. –

+0

Naprawdę nie mamy żadnego prawdziwego powodu, z wyjątkiem tego, jak to było zrobione przede mną w oryginalnej wersji aplikacji internetowej. Czy masz na myśli coś podobnego do '/ Customer/Edit/1234'? Omówiliśmy, że nie wygląda to * tak dobrze * jak '/ CustomerProfile/Edit", a inną rzeczą, która została podniesiona, było to, że nie chcieliśmy, aby nasi użytkownicy zastąpili bieżący numer losową liczbą, aby wyciągnąć kolejny naszych klientów. BTY, to tylko wewnętrzna aplikacja internetowa. Gdzie stoisz na tym? – Turp

3

Jeśli to w jednym sterowniku, można to zrobić:

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    base.OnActionExecuting(filterContext); 
    ... // do your magic 
} 

To będzie ogień zanim na każdej realizacji działania. Nie można powrócić widok stamtąd choć, trzeba będzie przekierować do niczego, która zwraca wynik działania, np:

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Shared" }, { "action", "Home" } }); 

Ale, oczywiście, że należy skierować do akcji w kontrolerze to nie dotkniętej nadpisanie, w przeciwnym razie masz przekierowanie kołowe. :)