如何调用另一个控制器操作从Mvc中的控制器

我需要从控制器A调用控制器B操作FileUploadMsgView,并且需要传递一个参数。

Code---its not going to the controller B's FileUploadMsgView(). In ControllerA private void Test() { try {//some codes here ViewBag.FileUploadMsg = "File uploaded successfully."; ViewBag.FileUploadFlag = "2"; RedirectToAction("B", "FileUploadMsgView", new { FileUploadMsg = "File uploaded successfully" }); } In ControllerB receiving part public ActionResult FileUploadMsgView(string FileUploadMsg) { return View(); } 

控制器只是类 – 新的一个,并调用行动方法,就像任何其他类成员:

var result = new ControllerB().FileUploadMsgView("some string");

正如@mxmissile在接受的答案的评论中所说,你不应该新build控制器,因为它将缺less为IoC设置的依赖关系,并且不会有HttpContext

相反,你应该像这样得到你的控制器的一个实例:

 var controller = DependencyResolver.Current.GetService<ControllerB>(); controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller); 

您的示例看起来像伪代码。 您需要返回 RedirectToAction的结果:

 return RedirectToAction("B", "FileUploadMsgView", new { FileUploadMsg = "File uploaded successfully" }); 

正如@DLeh所说的使用而已

 var controller = DependencyResolver.Current.GetService<ControllerB>(); 

但是,给控制器一个控制器上下文是非常重要的,尤其是当你需要访问User对象, Server对象,或者“子”控制器中的HttpContext

我添加了一行代码:

 controller.ControllerContext = new ControllerContext(Request.RequestContext, controller); 

否则你也可以使用System.Web来访问当前的上下文,访问Server或早期的提到的对象

NB:我的目标是框架版本4.6(Mvc5)

这正是我发现RedirectToAction()不会传递复杂的类对象后,正在寻找。

例如,我想调用LifeCycleEffectsResults控制器中的IndexComparison方法,并将其传递给一个名为model的复杂类对象。

这是失败的代码:

 return RedirectToAction("IndexComparison", "LifeCycleEffectsResults", model); 

值得注意的是,string,整数等在这个控制器方法中幸存下来,但是generics列表对象正在遭受到让人想起C内存泄漏的痛苦。

如上所述,以下是我replace的代码:

 var controller = DependencyResolver.Current.GetService<LifeCycleEffectsResultsController>(); var result = controller.IndexComparison(model); return result; 

所有的工作都是按照预期进行的 谢谢你领导的方式。

让parsing器自动做到这一点。

内部控制器:

 public class AController : ApiController { private readonly BController _bController; public AController( BController bController) { _bController = bController; } public httpMethod{ var result = _bController.OtherMethodBController(parameters); .... } }