2016-04-27 168 views
1

我嘗試從功能BeginExecuteCore重定向到另一個控制器 所有我控制器繼承功能BeginExecuteCore,我希望做一些邏輯,如果事情發生,所以重定向到「XController」MVC 5從BeginExecuteCore重定向到另一個控制器

如何做它?

編輯:

巴爾德: 我使用功能BeginExecuteCore我無法響應使用Controller.RedirectToAction

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


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


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

雖然您的問題缺乏細節,但您可以閱讀有關Controller.RedirectToAction方法。 – Balde

回答

3

的巴爾德的解決方案工作,但不是最佳的。

讓我們舉個例子:

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

如果運行這個項目,你會明顯得到了谷歌主頁。但是如果你看看你的IDE,你會注意到由於斷點,代碼正在等待你。 爲什麼?因爲你重定向了響應,但並沒有停止ASP.NET MVC的流動,所以它繼續這個過程(通過調用動作)。

這不是一個大問題,一個小網站,但如果你預計將有大量的遊客,這可以成爲一個嚴重性能問題:因爲反應已經消失了每秒運行的請求沒有任何的潛在千元。

你怎麼能避免這種情況?我有一個解決方案(不是一個漂亮的一個,但它的工作):

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

您存儲控制器部件內部的重定向結果和OnActionExecuting運行時,你執行吧!

+0

機會是你會收到這種錯誤,因爲我現在用這個解決方案 INET_E_REDIRECT_FAILED –

2

重定向:

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

驚人的工作表示感謝! :) – liran

相關問題