2016-04-27 4 views
1

ich versuche, von Funktion BeginExecuteCore auf einen anderen Controller alle meine Controller Vererbung die Funktion BeginExecuteCore zu umleiten und ich möchte einige Logik tun, wenn etwas umleiten happen so zu „Xcontroller“MVC 5 Umleitung von BeginExecuteCore auf einen anderen Controller

Wie TU es?

EDIT:

Balde: I Funktion BeginExecuteCore verwende ich kann nicht Controller.RedirectToAction

 protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) 
    { 


     //logic if true Redirect to Home else ....... 


     return base.BeginExecuteCore(callback, state); 
    } 
+0

Obwohl Ihre Frage keine Details enthält, können Sie über die Controller.RedirectToAction-Methode lesen. – Balde

Antwort

3

Die Lösung der Balde funktioniert, aber ist nicht optimal.

Lassen Sie uns ein Beispiel:

public class HomeController : Controller 
{ 
    protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) 
    { 
     Response.Redirect("http://www.google.com"); 
     return base.BeginExecuteCore(callback, state); 
    } 

    // GET: Test 
    public ActionResult Index() 
    { 
     // Put a breakpoint under this line 
     return View(); 
    } 
} 

Wenn Sie das Projekt und führen Sie offensichtlich die Google Haupt-Seite bekommen. Aber wenn Sie Ihre IDE betrachten, werden Sie feststellen, dass der Code aufgrund des Breakpoints auf Sie wartet. Warum? Da Sie die Antwort umgeleitet haben, den ASP.NET MVC-Fluss jedoch nicht gestoppt haben, wird der Prozess fortgesetzt (durch Aufrufen der Aktion).

Es ist kein großes Problem für eine kleine Website, aber wenn Sie viele Besucher haben prognostiziert, dies ist ein ernst Performance-Problem werden kann: potenziell Tausende von Anfragen pro Sekunde dieses Lauf für nichts, weil die Antwort bereits verschwunden ist .

Wie können Sie das vermeiden? Ich habe eine Lösung (keine hübschen, aber es macht den Job):

public class HomeController : Controller 
{ 
    public ActionResult BeginExecuteCoreActionResult { get; set; } 
    protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state) 
    { 
     this.BeginExecuteCoreActionResult = this.Redirect("http://www.google.com"); 
     // or : this.BeginExecuteCoreActionResult = new RedirectResult("http://www.google.com"); 
     return base.BeginExecuteCore(callback, state); 
    } 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Result = this.BeginExecuteCoreActionResult; 

     base.OnActionExecuting(filterContext); 
    } 

    // GET: Test 
    public ActionResult Index() 
    { 
     // Put a breakpoint under this line 
     return View(); 
    } 
} 

Sie speichern Ihre Umleitung Ergebnisse innerhalb eines Controller-Mitgliedes und Sie es ausführen, wenn der OnActionExecuting läuft!

+0

Wahrscheinlich erhalten Sie diese Art von Fehler, wie ich jetzt mit dieser Lösung INET_E_REDIRECT_FAILED –

2

Redirect von Antwort verwenden:

Response.Redirect(Url.RouteUrl(new{ controller="controller", action="action"})); 
+0

Erstaunlich funktioniert dank !!!! :) – liran