2011-05-05 82 views
0


我有一個如下所示的操作。在GetAvailableBookList中,我得到列表,如果沒有任何可用的書籍重定向到消息頁面。但是,在行動部分代碼繼續執行,並得到一個例外,我發現自己在錯誤頁面。 我不想使用return RedirectToAction或類似的東西,因爲在我們的應用程序中有很多地方使用這個重定向邏輯。Asp.Net MVC3重定向

public ActionResult ActionName() 
    { 
     List<BookType> bookList = GetAvailableBookList(); 
     // some code 
     return View("RelatedView"); 
    } 

    private List<BookType> GetAvailableBookList() 
    { 
     .... 
     list = GetList(); 
     if(list.Count == 0) 
     { 
      System.Web.HttpContext.Current.Response.Redirect(messagePageUrl, true); 
     } 
     else return list; 
    } 
+0

我的看法是,你不會在GetAvailableBookList()級別,而是在做一個重定向ActionResult ActionName()級別。由於GetAvailableBookList()會像前面提到的那樣從各個區域被調用。 – 2011-05-05 14:26:07

+0

然後我會在每個Action中重複重定向,我不想這樣做。這是一個具體的例子。在商業部分,我們爲幾個目的重做數次。例如,在獲取列表時,如果用戶現在可以看到此列表,我可能需要檢查時間。 – xesulius 2011-05-05 14:41:30

回答

0

使用

return RedirectToAction("NoListAvailable"); 
如果你有你想執行一個特定的動作

。 NoListAvailable操作可以返回一個指示問題的視圖。

或者,你可以返回視圖中直接

return View("NoListAvailable"); 
+0

他說他不想這樣做。 – Talljoe 2011-05-05 14:26:00

+0

我不想返回任何東西,因爲我在問題中說過,我只想做一個經典的重定向。 – xesulius 2011-05-05 14:28:12

+0

我不誠實地看到RedirectToAction和古典重定向之間的區別。一個保持與MVC模式,另一個打破它。你真的需要一個Response.Redirect()嗎? – tomasmcguinness 2011-05-05 14:36:56

0

你所得到的例外可能是ThreadAbortException,這是你無法避免,除非你允許線程繼續(在Response.Redirect的第二個參數)。

在旁邊注意您目前的解決方案通常是有缺陷的。當您的方法返回空列表時,您應該在每個操作中使用RedirectToAction。

+0

這個例外是因爲在代碼中,我使用類似於:list [0]的東西,因爲列表爲空,所以我得到異常 – xesulius 2011-05-05 14:30:09

1

不幸的是,Response.Redirect()對ASP.NET MVC並不友好。我的經驗法則是,如果它來自HttpContext,我不想在控制器中觸及它(當然,該規則有很多例外) - 尤其是因爲它提高了可測試性。

我的建議是使用RedirectToAction,但因爲你不想重複代碼,你可以在這樣你就不必重複代碼(儘管在這種情況下,我沒有看到一個辦法做到這一點重複代碼的問題)。

public ActionResult LoadBookListAndContinue(
    Func<List<BookType>, ActionResult> continuation) 
{ 
    var list = LoadBooklist(); 
    if(list.Any()) 
    { 
    return action(continuation); 
    } 
    return new RedirectResult(messagePageUrl); 
} 


// in your controller 
public ActionResult ActionName() 
{ 
    return LoadBookListAndContinue(
    list => { 
     // some code 
     return View("RelatedView"); 
    }); 
} 

可愛嗎?不,但它比Redirect異常更好。

0

拋出一個特定的異常和重定向,你抓住它可能是解決

0

嘗試寫

System.Web.HttpContext.Current.Response.Redirect(messagePageUrl, false);