2010-05-24 115 views
2

我有兩個不同的對象:合同和任務訂單。我的要求指定爲了查看任一對象的詳細信息,根據哪種類型,Url應該是「http://.../Contract/Details」或「http://.../TaskOrder/Details」。他們都非常相似,細節頁面幾乎完全相同,所以我創建了一個可以是合同或任務訂單的類,並且具有一個變量「objectTypeID」,表示它是哪種類型。我在任務訂單控制器中編寫了「詳細信息」操作,但現在我想從合同控制器中調用該操作,而不是重新複製代碼。從另一個控制器調用一個動作

那麼有沒有什麼辦法讓url仍然說「.../Contract/Details」,而是在TaskOrder控制器中調用動作呢?我試着用

TaskOrderController TOController = new TaskOrderController(); 
TOController.Details(id); 

這只是我不能再使用HttpContext.Session工作過,這是我在行動中多次使用。

回答

1

你爲什麼要從控制器調用控制器?控制器操作應該通過路由調用並返回一個視圖。

如果你有兩個單獨的控制器使用的通用代碼,那麼你應該將這個代碼抽象到另一個類。

+0

視圖不應該調用控制器;他們應該撥打 路線。 – 2010-05-25 13:58:55

+0

好點。修訂。 – 2010-05-25 14:20:49

0

RedirectToAction("Details","To");

另外,如果你需要添加路由參數。

另外,也許你需要一個BaseController類,這兩個控制器繼承並實現相同的Details動作,但是基於objectTypeID做了些微不同的事情。

+0

這會工作,但它然後更改URL說「TaskOrder/Details」而不是「Contract/Details」 – Brian 2010-05-24 20:22:04

+0

那麼,詳細信息操作是在TaskOrder控制器中。也許它在邏輯上不屬於那裏?或許你有一個帶有詳細行爲的ContractController? – 2010-05-24 20:37:56

0

謝謝David,我應該從視圖中調用它。

所有我需要的是下面一行在我的合同/ Details.aspx頁:

<%= Html.Action("Details", "TaskOrder", new { id = ViewData["id"] })%>

0

爲控制器創建一個基類。 Like DetailsController

將您的詳細信息代碼放在那裏,並讓它接受typeId。 然後讓你的兩個控制器派生自那個基類,並且讓它們的Details操作調用傳入的基類,其ID爲

相關問題