从另一个控制器调用一个动作

时间:2010-05-24 20:14:05

标签: c# .net asp.net-mvc

我有两个不同的对象:合同和任务订单。我的要求指定为了查看任一对象的详细信息,Url应为“http://.../Contract/Details”或“http://.../TaskOrder/Details”,具体取决于哪种类型。它们非常相似,而且细节页面几乎相同,所以我创建了一个可以是契约或任务顺序的类,并且有一个变量“objectTypeID”来说明它是哪种类型。我在任务顺序控制器中编写了“详细信息”操作,但现在我想从合同控制器调用它而不是重新复制代码。

那么有没有办法让网址仍然说“... / Contract / Details”,而是调用TaskOrder控制器中的动作呢?我尝试使用

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

除了我不能再使用HttpContext.Session之外,这本来有用了,我在动作中多次使用过。

4 个答案:

答案 0 :(得分:1)

为什么要从控制器调用控制器?应通过路径调用控制器操作并返回视图。

如果您有两个独立控制器使用的公共代码,那么您应该将此代码抽象到另一个类。

答案 1 :(得分:0)

RedirectToAction("Details","To");

此外,如果需要,请添加路由参数。

此外,您可能需要一个BaseController类,这两个控制器继承并实现相同的Details操作,但基于objectTypeID执行稍微不同的操作。

答案 2 :(得分:0)

感谢大卫,我应该从视角中呼唤它。

我需要的只是我的Contract / Details.aspx页面中的以下行:

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

答案 3 :(得分:0)

为控制器创建基类。像DetailsController一样

将您的详细信息代码放在那里,让它接受typeId。 然后让你的两个控制器派生自该基类,并使其Details操作调用传入id

的基类