2010-11-02 64 views
1

我想我誤會了MVC的一些東西。我試圖做到以下幾點:從ActionB調用ActionA然後繼續ActionB

public class ControllerA : Controller 
{ 
    public ActionResult Index() 
    { 
     // do code 

     // perform action on ControllerB - something like: 
     // RedirectToAction("Action", "ControllerB"); 

     // CARRY ON with more code 
    } 
} 

public class ControllerB : Controller 
{ 
    public void Action() 
    { 
     // do code 
    } 
} 

顯然RedirectToAction("Action", "ControllerB");不起作用。那我該怎麼做呢?我想我可以讓所有需要使用Action()的控制器繼承ControllerB,但是感覺這是一種非常糟糕的方式。請幫忙!

+0

有意詳細說明ControllerB在做什麼//代碼?也許你需要在視圖代碼中使用RenderAction? – dotjoe 2010-11-02 04:01:14

+0

任何您想要在多個控制器中使用的重用業務邏輯。 – ajbeaven 2010-11-02 04:09:00

+0

然後,您應該將該業務邏輯放入單獨的類中,以便可以在多個控制器中使用它。 – dotjoe 2010-11-02 23:22:20

回答

3

你必須從RedirectToAction返回的ActionResult()

return RedirectToAction("Action", "ControllerB"); 

是你需要的,如果你想RedirectToAction實際重定向到一個動作該怎麼做。在你澄清了什麼「不工作」意味着你我認爲你應該讓所有的控制器都從一個基地繼承。這是一個非常標準的方法。

public class ControllerA : ControllerB 
{ 
    public ActionResult Index() 
    { 
     // do code 

     Action(); 

     // CARRY ON with more code 
    } 
} 

public class ControllerB : Controller 
{ 
    public void Action() 
    { 
     // do code 
    } 
} 
+0

如果Index()應該返回一個視圖並且Action()是無效的,那麼這是如何工作的?在RedirectToAction之後,Index()將不能繼續。 – ajbeaven 2010-11-02 03:07:04

+0

好的Index()不會繼續,你正在退出該方法。我不明白你的問題,因爲Action()沒有看法,所以你也沒有什麼可以重定向。 – jfar 2010-11-02 03:16:42

+0

這是因爲我不希望Action()返回一個視圖,我希望它做'某事',然後繼續執行調用它的操作。 – ajbeaven 2010-11-02 03:48:46

0

我相信您當前正在執行的控制器是類的實例,所以你需要做控制器B的一個實例,以便能夠在其上執行任何東西,所以你正在嘗試只是在那裏做沒有黑客就不會真正起作用。

我認爲不過有2種方法,以更好地獲得滿意的結果,我認爲你是後:

1)做出「ControllerBase」級別且所有控制器從它,而不是從「控制器」,那麼任何共享繼承你可以添加到基類中的代碼(也許是一種靜態方法),然後所有的控制器都可以作爲一個成員很好很容易地訪問它。 2)由於MVC會生成一個直線上升的DLL,您可以根據需要添加新類,例如添加一個新的項目文件夾,如'Globals'添加一個名爲'Funcs'的新類文件,並且您有一個靜態庫你可以從任何地方訪問,Funcs.SendEmail();等等

如果我脫離標記好了!無論如何hello

0

我已經從控制器工廠注入控制器作爲委託(Func CreateController)的工廠方法,並用它來創建子控制器,如在這種情況下。有很多方法可以實現您的目標,但我認爲這可能是快速獲得您想要的工作方式。