2012-04-10 7 views
6

Ich habe eine Sitzungsvariable, die in meiner MVC-Anwendung festgelegt ist. Wenn diese Sitzung abläuft und der Benutzer versucht, die Seite, auf der sie sich befinden, zu aktualisieren, wird auf der Seite ein Fehler ausgegeben, weil die Sitzung nicht mehr festgelegt ist.MVC Äquivalent von Page_Load

Gibt es irgendwo, ich kann überprüfen, ob die Sitzung vor dem Laden einer Ansicht festgelegt ist? Vielleicht etwas in die Global.asax-Datei einfügen?

Ich könnte so etwas am Anfang von JEDEM ActionResult tun.

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

Gibt es eine Alternative dazu? Was wäre die beste Vorgehensweise in diesem Fall?

+1

Sie benötigen eine benutzerdefinierte Aktion Filter, einige weitere Informationen http: // msdn .microsoft.com/de-de/gg618482 –

+0

Ähnliche Diskussion hier: http://forums.asp.net/t/1287687.aspx –

+0

Zusätzlich zu @ ChrisDiver Kommentar, wenn Sie es auf alle Ihre Controller/Aktionen angewendet benötigen Sie können einen Basiscontroller einrichten, von dem alle anderen Controller erben. – Chris

Antwort

0

Zuerst sollten Sie nach Home umleiten, nicht die Home View zurückgeben, sonst haben Sie die seltsame Situation der Homepage angezeigt trotz der URL woanders.

Zweitens ist Session nie Null, weil eine neue Sitzung erstellt wird, wenn die alte abläuft oder zurückgesetzt wird. Sie würden stattdessen nach Ihrer Variablen suchen und wenn THAT null ist, dann wissen Sie, dass die Sitzung neu ist.

Drittens, wenn Sie App hängt von dieser Sitzung Daten, dann würde ich überhaupt keine Sitzung verwenden. Verwenden Sie dies, um Daten zwischenzuspeichern? Wenn dies der Fall ist, ist die Verwendung von Cache möglicherweise die bessere Wahl (Ihre App wird benachrichtigt, wenn Cache-Elemente ablaufen).

Leider ist dies wahrscheinlich ein Fall von The XY Problem. Sie haben ein Problem, und Sie glauben, dass Session Ihr Problem löst, aber Sie stoßen auf ein anderes Problem mit Session. Daher fragen Sie, wie Sie Ihr Sitzungsproblem lösen können und nicht, wie das Problem gelöst werden soll.

Was ist das eigentliche Problem, das Sie versuchen, damit zu lösen?

EDIT:

Basierend auf Ihren Kommentar unten, warum Sie nicht die Kundennummer in der URL übergeben:

http://website/Controller/ViewRecord/3 

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

Die Webanwendung ermöglicht die Suche nach einem Kunden. Wir wählen einen Kunden anhand seiner ID-Nummer aus. Ich stelle ein, dass ID Nummer eine Sitzung hat.Hier ist, wo ich das an: '\t \t public static string CIF \t \t { \t \t \t bekommen \t \t \t { \t \t \t \t if (HttpContext.Current.Session [ "CIF"] == null) \t \t \t \t \t zurück ""; . \t \t \t \t sonst \t \t \t \t \t Rückkehr HttpContext.Current.Session [ "CIF"] ToString(); \t \t \t} \t \t \t Menge {HttpContext.Current.Session [ "CIF"] = Wert; } \t \t} '- Dann auf einer Ansicht, ich rufe MyClass.CIF, um den Wert der Sitzung zu erhalten. – Turp

+0

@Turp - Warum müssen Sie den Kunden zur Sitzung hinzufügen? Warum nicht einfach die Kundennummer in der URL übergeben? Dann wird der Wert nicht in der Sitzung gespeichert und er verschwindet, wenn Sie ihn nicht mehr benötigen. –

+0

Wir haben wirklich keinen Grund, außer dass es in der ursprünglichen Version der Web-App so gemacht wurde. Meinst du etwas in der Art von '/ Customer/Edit/1234'? Wir hatten besprochen, dass es nicht so gut aussieht wie "/ CustomerProfile/Edit" und eine andere Sache war, dass wir einfach nicht wollten, dass unsere Benutzer die aktuelle Nummer durch eine Zufallszahl ersetzen, um eine andere zu erreichen unserer Kunden. BTY, das ist nur eine interne Webanwendung. Wo stehst du darauf? – Turp

3

Wenn es in einem Controller ist, können Sie dies tun:

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

Es wird bei allen Maßnahmen Ausführung Feuer vor. Sie können einen Blick von dort allerdings zurückkehren, werden Sie zu etwas umleiten, die Aktion Ergebnis zurückgibt, zB:

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

Aber natürlich, das auf die Aktion in der Steuerung umleiten soll, die nicht betroffen sind durch die Überschreibung, sonst haben Sie eine zirkuläre Umleitung. :)

Verwandte Themen