2013-06-19 31 views
3

在同一個控制器的動作我有2個動作在一個控制器如何重複使用MVC

public ActionResult DoSomething() 
{ 
    ... 
} 

public ActionResult SoSomethingAgain() 
{ 
    ... 
} 

我想有兩個請求去同樣的動作。

也許是一個別名....

[ie. SoSomethingAgain] 
public ActionResult DoSomething() 
{ 
    ... 
} 

什麼是正確的做法?

+0

您可以使用此屬性'[ActionName(「SoSomethingAgain」)]''DoSomething'操作方法嗎? –

回答

2

如果SoSomethingAgain是所謂的行動,那麼前面兩個答案將運行裏面DoSomething的代碼,但控制器動作和上下文還是SoSomethingAgain。這意味着DoSomething中的返回View()語句將查找SoSomethingAgain視圖。

同樣,管道將使用SoSomethingAgain上定義的過濾器,而不是DoSomething上的過濾器。如果您在DoSomething上放置了[授權]過濾器,您可以看到這一點。如果您點擊DoSomething操作,系統會提示您登錄,但如果您點擊SoSomethingElse操作,則不會提示您。

也許這就是你想要的,也許不是。如果不是,並且您希望同時擁有DoSomething網址和SoSomethingElse網址,但都運行相同的代碼,那麼可以擺脫SoSomethingElse控制器操作,並添加自定義路由(在默認路由之前)。

routes.MapRoute(
    name: "SoSomethingAgainRoute", 
    url: "{controller}/SoSomethingAgain/{id}", 
    defaults: new { controller = "Home", action = "DoSomething", id = UrlParameter.Optional } 
); 
+0

你的答案現在是最好的!正是我在找什麼! – Pinch

5

SoSomethingAgain只是這樣做:

return DoSomething(); 

你唯一的其他選擇是建立一個特定Route該控制器在所述應用程序開始你設置的路線。這將會比它的價值更多的工作。

+0

非常好,你是對的,我想知道是否會有一種方法帶走了控制器? – Pinch

+1

@Pinch,構建具體的'路線'將帶走控制器。你可以將'SoSomethingAgain'路由到'DoSomething',但我只是說這些代碼比它更值得**,**這樣**就更加**混淆了。當你用這種方式編寫代碼時,維護人員很容易看到發生了什麼,而不是調試爲什麼世界上的SoSomethingAgain甚至可以工作。 –

+0

+1教我「混淆」和一個很好的解釋 – Pinch

7

如果我讀這正確,你可以這樣做:

public ActionResult DoSomething() 
{ 
    ... 
} 

public ActionResult SoSomethingAgain() 
{ 
    return DoSomething(); 
} 
+0

哈 - 邁克爾類型比我快:) –

+0

非常好,你是正確的,我想知道是否會有一種方法帶走了控制器? – Pinch