2013-04-22 10 views
7

Ich habe einen benutzerdefinierten Aktionsfilter, der innerhalb der OnActionExecuting, abhängig von bestimmten Kriterien, einen Benutzer abmeldet und sie auf die Homepage der Site umleitet. Der (abgezogene) Code für den Weiterleitungsteil ist unterFestlegen von TempData in einem ActionFilterAttribute

filterContext.Controller.TempData.Add("key", "Message"); 

    filterContext.Result = new RedirectResult("/"); 

Wie oben, setze ich auch eine tempData Nachricht. Da der Benutzer abgemeldet wurde, wenn er die Startseite aufruft, wird das Attribut [Authorize] diese auf die Login-Seite GET leiten. In der Login-Ansicht zeige ich alle Nachrichten von tempData an. In dieser Situation ist das TempData jedoch leer.

Das ist sehr ähnlich wie mein Login-POST funktioniert (wenn es ungültig ist, wird es nach Hause umgeleitet, das zum Login umleitet und die tempData-Nachricht anzeigt, die im Login-Post gesetzt wurde). Dieser Code kann unter

TempData.Add("key", errorMessage); 

    return Redirect("/")); 

Der Grund, warum ich es tue, so gesehen werden, anstatt speziell auf die Anmeldeseite umgeleitet wird, da dieser Code über viele Standorte verteilt sind, so wissen wir nicht, was die Login-URL erhalten ist .

Hat jemand irgendwelche Informationen, warum dies für den Login POST funktioniert, aber nicht für die ActionFilter Redirect?

Edit:

Wenn ich den Logout-Aufruf innerhalb der benutzerdefinierten Aktion Filter zu entfernen, die TempData noch innerhalb des Heimes Aktion gesetzt - aber diese nicht erklären, warum es für die Anmeldung POST funktioniert aber nicht der Action-Filter?

Antwort

4

So stellte sich heraus, dass, wenn ich den Benutzer aus dem System abmeldete, ich auch die Sitzung (Aufruf HttpContextBase.Session.Abandon()) aufgab und auch die Cookie-Session-ID zurückgesetzt. Diese beeinflussten das TempData-Verhalten. Durch das Entfernen dieser Aufrufe wird die TempData jetzt korrekt festgelegt und angezeigt.

-1

Wenn Sie das Ergebnis auf new RedirectResult("/") setzen, wird die aktuelle Serververarbeitung gestoppt und der Client erhält eine Antwort, die den Client anweist, eine neue URL anzufordern - die, die Sie im RedirectResult angegeben haben. Die zweite Anforderung ist dann anders und enthält nicht die Werte aus der vorherigen Verarbeitung. Versuchen Sie, Redirect("/"); oder Server.Transfer("/"); zu verwenden, um die neue Route in derselben Clientanforderung zu bedienen.

+0

Das ist das Verhalten, nach dem ich bin - ich möchte, dass der Client eine neue URL anfordert. Der Grund dafür, dass die TempData leer war, lag an der Aufgabe der Sitzung. – Rob