Wie leite ich von OnActionExecuting in Base Controller um?

183

Ich habe zwei Möglichkeiten ausprobiert: Response.Redirect (), die nichts bewirkt, sowie das Aufrufen einer neuen Methode im Basis-Controller, die ein ActionResult zurückgibt und RedirectToAction () zurückgibt ... keine dieser Funktionen.

Wie kann ich eine Umleitung von der OnActionExecuting-Methode durchführen?

MetaGuru
quelle

Antworten:

362
 public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    ...
    if (needToRedirect)
    {
       ...
       filterContext.Result = new RedirectResult(url);
       return;
    }
    ...
 }
womp
quelle
79
Anstelle von new RedirectResult(url)dir könnte man auch verwenden new RedirectToAction(string action, string controller). Dies wurde möglicherweise zu MVC hinzugefügt, nachdem Sie Ihre Antwort veröffentlicht haben. Ihre Lösung hat mich trotzdem auf den richtigen Weg gebracht.
Manfred
3
@Pluc - OnActionExecuting erfolgt zuerst. Wenn Sie den Kontext festlegen. Ergebnis, erfolgt die Umleitung, bevor die Aktion ausgeführt wird. (Verifiziert durch persönliches Testen / Debuggen.)
James
39
@Manfred Hinweis, die Zuordnung sollte zur Methode (ohne new) RedirectToAction erfolgen:filterContext.Result = RedirectToAction(string action, string controller);
cederlof
1
@Manfred Ich wollte nur hinzufügen, dass Sie die RedirectToAction nicht neu starten würden. Es ist nur filterContext.Result = RedirectToAction (..)
Sinaesthetic
4
Der Name 'RedirectToAction' existiert im aktuellen Kontext nicht ??
Dan Hastings
55

Dies kann auch folgendermaßen geschehen:

filterContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary
    {
        {"controller", "Home"},
        {"action", "Index"}
    }
);
Randy Burden
quelle
35

Erstellen Sie eine separate Klasse,

    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"
            }));
        }
      }
   }

Wenn Sie dann einen Controller erstellen, rufen Sie diese Anmerkung als auf

[RedirectingAction]
public class TestController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}
K. Kirivarnan
quelle
Ich bevorzuge dieses anonyme Objekt für denRouteValueDictionary Konstruktor, da es das Routing an anderer Stelle in MVC widerspiegelt. +1
Gone Coding
3

Wenn der umgeleitete Controller von demselben erbt, bei dem baseControllerwir die OnActionExecutingMethode überschreiben , wird eine rekursive Schleife verursacht. Angenommen, wir leiten es an die Anmeldeaktion des Account Controllers weiter, dann ruft die Anmeldeaktion die OnActionExecutingMethode auf und leitet sie immer wieder an dieselbe Anmeldeaktion weiter. Daher sollten wir eine Eincheckmethode anwenden, um OnActionExecutingzu überprüfen, ob die Anforderung vom selben Controller stammt, wenn Leiten Sie die Anmeldeaktion dann nicht erneut um. Hier ist der Code:

geschützte Übersteuerung.

void OnActionExecuting(ActionExecutingContext filterContext)
{
   try
   {
      some condition ...
   }
   catch
   {
      if (filterContext.Controller.GetType() !=     typeof(AccountController))
      {
         filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Account" }, { "action", "Login" } });
      }
   }
}
abdul hameed
quelle
1
try {int CompanyId = UserContext.Company.CompanyId; } catch {if (filterContext.Controller.GetType ()! = typeof (AccountController)) {filterContext.Result = new RedirectToRouteResult (neues RouteValueDictionary {{"controller", "Account"}, {"action", "Login"}} ); }}
abdul hameed