2009-09-08 50 views
5

ASP.Net MVC控制器有幾種將控制轉發給另一個控制器或動作的方法。但是,所有這些都會導致客戶端重定向,包含302和新的瀏覽器請求。爲什麼ASP.Net MVC(或CodeIgniter)中沒有內部控制器重定向?

爲什麼沒有內部「調用另一個控制器的動作」功能,沒有涉及到客戶端?我很確定php CodeIgniter框架也缺少這個功能。

我可以想出最好的理由是最終它是沒有必要的,因爲你想調用的任何代碼都可以分解到某個共同的地方,至少在ASP.Net MVC中,操作可能相當昂貴。但是a lot of people ask about this,它似乎最終會是一個方便。

因此......許多聰明的人設計了這些框架。有沒有這個好理由?

回答

4

在Codeigniter中,您可以設置自定義路由和內容來將某些URL引導到其他控制器/操作,但是我認爲您的意思是在控制器功能的中間跳轉到另一個控制器/操作?

如果您有任何業務邏輯,特別是如果要重用它,它應該進入模型而不是控制器。您還可以根據某些條件或某種情況在控制器中指定不同的視圖。如果你有重複的代碼不適合模型,那麼它應該最終成爲一個靜態輔助函數,或者在一個庫類中。

所以,是的,我認爲當你說你是對的:

,我能想出的最好的理由是,最終它是不必要的,因爲任何代碼要調用到可以被分解進入某個共同的地方

這迫使你停留在MVC模式中。

無論如何,最好讓你的控制器輕量級。

2

我懷疑它可能違背REST的想法,一切都是資源。如果您希望執行服務器傳輸,則可以爲該資源提供額外的URL。通過這種方式,客戶將知道該特定網址,他將收到資源的一種特定表示,而不是在其他情況下。實際上這是有道理的。

+0

我也想過這個。您顯然會通過執行內部重定向消耗多個資源(如您的路由所定義的),這是非常不可靠的。我不確定這是否是排除功能的足夠好的理由,但在我的思維過程中,它是高的。 – womp 2009-09-08 21:46:02

4

那麼,至少在ASP.NET MVC中,控制器操作只是以創造性方式調用的C#方法。所以,你可以顯式調用另一個控制器動作,就像這樣:

樣品控制器:

public class SampleController : Controller 
{ 
    public ActionResult Foo() 
    { 
     return View("foo"); 
    } 

    public ActionResult ShowMeFoo() 
    { 
     return Foo(); 
    } 
} 

現在,我想在一個不希望做到這一點大多數情況下。考慮到urls作爲你的應用程序的RPC接口,當獲得不同的結果時,它應該轉發到不同的url。不適用於所有情況,但可以適用於所有情況。

+0

非常真實。我想我更關心使用重定向方法轉移到另一個控制器,如RedirectToAction(),但如果您使用的是同一個控制器,這是避免重定向的好方法。 – womp 2009-09-09 16:27:52

相關問題