2010-05-12 127 views
25

我在傳統的ASP和ASP.NET webforms中使用了response.redirect。但是,對於MVC 2.0,我遇到了一些奇怪的事情。在ASP.NET MVC中,response.redirect如何工作?

我有一個控制器類中的私有方法,多個控制器方法使用它來幫助加載和驗證一些信息。如果發現問題到通用錯誤消息頁面,則此專用方法設置爲重定向。

我注意到的一個大問題是調用控制器類和頁面視圖試圖在實際發生重定向之前完成渲染和加載。這在開發中很煩人,因爲View會拋出異常,在最終加載通用錯誤頁面之前我需要忽略這些異常。

如上所述,我習慣於老式的response.redirect模式,它阻止頁面上的後續代碼被執行,因爲新頁面隨後會加載。

任何有關MVC重定向的幫助或建議將不勝感激。

+1

請向我們顯示您的代碼。 – SLaks 2010-05-12 20:37:07

+0

你有沒有聽說過叫做「Fiddler」的診斷工具?你可能會發現它對於查看你的頁面正在做什麼非常有用。 – 2010-05-12 20:40:33

+0

我認爲你在私人方法中調用'Response.Redirect'? – 2010-05-12 20:44:38

回答

42

常規機制在ASP.Net MVC重定向是類型RedirectResult的對象返回到客戶端。如果這是在您的View方法被調用之前完成的,那麼您的視圖方法將永遠不會被調用。

如果您自己調用Response.Redirect,而不是讓Asp.Net MVC的前端控制器爲您執行此操作,則您的控制器方法將繼續,直到它完成或引發異常。

您問題的習慣解決方案是讓您的私有方法返回您的控制器可以使用的結果。

例如:

public ActionResult Edit(MyEntity entity) 
{ 
    if (!IsValid()) return Redirect("/oops/"); 
    ... 
    return View(); 

} 

private bool IsValid() 
{ 
    if (nozzle==NozzleState.Closed) return false; 
    if (!hoseAttached) return false; 
    return (userRole==Role.Gardener); 
} 
+0

這解釋了我所看到的,並且是一個很好的解決方案。謝謝您的幫助! – Swoop 2010-05-13 13:28:19

+0

嗨賈森,你可以評論爲什麼代碼繼續,而不是線程被中止,按照WebForms'Response.Redirect'? – 2013-08-29 09:56:57

+0

@JasonTrue:是的,我也想知道爲什麼線程沒有終止。 – 2014-08-15 13:05:27

18

在ASP.NET MVC中,您通常會通過從控制器方法返回RedirectResult重定向到另一頁。

實施例:

public ActionResult Details(int id) 
{ 
    // Attempt to get record from database 
    var details = dataContext.GetDetails(id); 

    // Does requested record exist? 
    if (details == null) 
    { 
     // Does not exist - display index so user can choose 
     return RedirectToAction("Index"); 
    } 

    // Display details as usual 
    return View(details); 
} 
+0

很棒的回答。謝謝您的幫助! – Swoop 2010-05-13 13:28:51

-3

嘗試在MVC視圖頁面礦脈這段代碼

 if (Session["UserName"] == null) 
     { 
      this.Response.Redirect("LogOn"); 

     } 
+4

我們強烈建議不要在MVC應用程序中調用Response.Redirect。您應該從操作或過濾器中返回一個RedirectResult。 – RickAndMSFT 2012-03-01 21:17:26

+0

@RickAnd - MSFT爲什麼不鼓勵?我知道顯然RedirectResult是優越的,但爲什麼Response.Redirect不鼓勵? – 2014-07-30 22:47:14

+0

好問題,請參閱我的博客Response.Redirect和ASP.NET MVC - 不要在http://blogs.msdn.com/b/rickandy/archive/2012/03/01/response-redirect-and-asp-淨MVC-拒收mix.aspx – RickAndMSFT 2014-07-31 23:34:03

7

在MVC中從未使用Response.Redirect 使用

return RedirectToAction("ActionResultName", "ControllerName"); 

至於爲什麼要NOT在MVC中使用Response.Redirect:

  1. 性能問題與它
  2. 不遵循標準的MVC模式和約定,專門爲MVC構建。
1

它的推薦和它的唯一方式重定向到asp。在MVC控制器動作淨形式使用

return Redirect("/page/pagename.aspx"); 

其他方式,我們可以通過使用重定向(不推薦和壞的方式)

Response.Redirect("/page/pagename.aspx", true); 

它將爲重定向工作,但問題是,它會清除所有的我們的會話值。所以爲什麼不推薦。