2010-07-09 11 views

Odpowiedz

310
public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    ... 
    if (needToRedirect) 
    { 
     ... 
     filterContext.Result = new RedirectResult(url); 
     return; 
    } 
    ... 
} 
+71

Zamiast "new RedirectResult (url)" można również użyć 'new RedirectToAction (akcja łańcuchowa, kontroler stringów)'. Mogło to zostać dodane do MVC po opublikowaniu odpowiedzi. Twoje rozwiązanie i tak postawi mnie na dobrej drodze. – Manfred

+3

+1000 Dziękujemy! – IamStalker

+0

Nie wykonam tego, co jest w aktualnej akcji? Czy to nie byłaby wada bezpieczeństwa? Powiedzmy, że istnieje akcja, która usuwa użytkownika routowanego przez/Admin/Delete/4. Jeśli Twoim celem jest sprawdzenie, czy jesteś administratorem i przekieruj, jeśli nie. Użytkownik 4 zostanie usunięty, nawet jeśli skończy się przekierowanie, prawda? – Pluc

49

To można zrobić w ten sposób, a także:

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

utworzyć osobną klasę,

public class RedirectingAction : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext context) 
     { 
     base.OnActionExecuting(context); 

     if (CheckUrCondition) 
     { 
      context.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
      { 
       controller = "Home", 
       action = "Index" 
      })); 
     } 
     } 
    } 

Następnie Podczas tworzenia kontrolera, nazywają to adnotacji jako

[RedirectingAction] 
public class TestController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
+0

Wolę ten * anonimowy obiekt dla konstruktora 'RouteValueDictionary' *, ponieważ odzwierciedla on routing w innym miejscu MVC. +1 –

+0

To jest genialne! dzięki – Johny

2

I f przekierowany kontroler dziedziczy z tego samego baseController, gdzie nadpisujemy metodę OnActionExecuting powodującą pętlę rekursywną. Załóżmy, że przekierowujemy go do działania logowania kontrolera konta, a następnie akcja logowania wywoła metodę OnActionExecuting i przekierowuje do tej samej akcji logowania ponownie ... Dlatego powinniśmy zastosować metodę sprawdzania w metodzie OnActionExecuting, aby sprawdzić pogodę, czy żądanie pochodzi z ten sam kontroler, jeśli tak, to nie przekierowuj ponownie akcji logowania. tutaj jest kod:

zabezpieczenie przed przesuwaniem.

void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    try 
    { 
     some condition ... 
    } 
    catch 
    { 
     if (filterContext.Controller.GetType() !=  typeof(AccountController)) 
     { 
     filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } }); 
     } 
    } 
} 
+1

spróbuj { int CompanyId = UserContext.Company.CompanyId; } haczyk { if (filterContext.Controller.GetType()! = Typeof (AccountController)) { filterContext.Result = new RedirectToRouteResult ( nowy RouteValueDictionary {{ "Kontroler", "Konto"}, { „działanie ", "Zaloguj Się" } }); } } –

+0

dobry połów abdul, dzięki – HolloW

Powiązane problemy