2009-09-29 17 views
39

Napisałem filtr działania, który wykrywa nową sesję i próbuje przekierować użytkownika na stronę informującą, że tak się stało. Jedyny problem polega na tym, że nie mogę znaleźć sposobu przekierowania do kontrolera/kombi akcji w filtrze akcji. Mogę zamiast tego tylko dowiedzieć się, jak przekierować do określonego adresu URL. Czy istnieje bezpośredni sposób przekierowania do kontrolera/kombi akcji w filtrze akcji w mvc2?Przekierowanie do określonego kontrolera i akcji w asp.netowym filtrze akcji mvc

Odpowiedz

87

Zamiast się odniesienie do HttpContent i przekierowanie bezpośrednio w ActionFilter można ustawić wynik kontekście filtra być RedirectToRouteResult. Jest nieco czystszy i lepszy do testowania.

Jak to:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if(something) 
    { 
     filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary {{ "Controller", "YourController" }, 
             { "Action", "YourAction" } }); 
    } 

    base.OnActionExecuting(filterContext); 
} 
+1

Moja głowa bolała, a teraz nie. Dzięki – jolySoft

+3

To jest znacznie bardziej odpowiednia odpowiedź niż moja. To było moje pierwsze pytanie na temat MVC i dzisiaj odpowiem na to w ten sposób. –

4

połączeń RedirectToAction użyciu this overload:

protected internal RedirectToRouteResult RedirectToAction(
    string actionName, 
    RouteValueDictionary routeValues 
) 

w filtrach akcji, historia jest nieco inna. Na dobry przykład, patrz tutaj:

http://www.dotnetspider.com/resources/29440-ASP-NET-MVC-Action-filters.aspx

+0

To dobre miejsce, aby spojrzeć na przekierowanie w filtrze działania (+1), ale naprawdę chcę określić combo kontroler/działania do mojego filtra. Nie chciałem też łączyć łańcuchów w przypadku niestandardowego routingu, ale znalazłem coś, co mogłoby pomóc. Zobacz moją odpowiedź. –

17

EDIT: Oryginalny pytanie było o tym, jak wykryć sesji wylogowanie, a następnie automatycznie przekierować do określonego kontrolera i akcji. Pytanie okazało się jednak znacznie bardziej użyteczne w obecnej formie.


Skończyłem z wykorzystaniem kombinacji przedmiotów, aby osiągnąć ten cel.

Najpierw jest ustawiony filtr wygasania sesji here. Potem chciałem w jakiś sposób określić kombinację kontrolera/akcji, aby uzyskać przekierowanie, które znalazłem wiele przykładów here. W końcu wpadłem na to:

public class SessionExpireFilterAttribute : ActionFilterAttribute 
{ 
    public String RedirectController { get; set; } 
    public String RedirectAction { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpContext ctx = HttpContext.Current; 

     if (ctx.Session != null) 
     { 
      if (ctx.Session.IsNewSession) 
      { 
       string sessionCookie = ctx.Request.Headers["Cookie"]; 
       if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) 
       { 
        UrlHelper helper = new UrlHelper(filterContext.RequestContext); 
        String url = helper.Action(this.RedirectAction, this.RedirectController); 
        ctx.Response.Redirect(url); 
       } 
      } 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 
+7

Jeśli chcesz uczynić to bardziej testowalnym, wierzę, że możesz po prostu ustawić filterContext.Result na RedirectResult, zamiast jawnie przekierowywać. Wynik netto jest taki, że MVC nadal wykonuje przekierowanie, ale w ten sposób można napisać testy jednostkowe, które ręcznie wywołują funkcję OnActionExecuting(), a następnie działają przeciwko filtreContext.Result. –

Powiązane problemy