173

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

它不会去控制器 B 的FileUploadMsgView()

这是代码:

控制器A:

private void Test()
{
    try
    {   //some codes here
        ViewBag.FileUploadMsg = "File uploaded successfully.";
        ViewBag.FileUploadFlag = "2";
        RedirectToAction("B", "FileUploadMsgView", new { FileUploadMsg = "File   uploaded successfully" });
    }
}

ControllerB(接收部分):

public ActionResult FileUploadMsgView(string FileUploadMsg)
{
    return View();
}
4

11 回答 11

239

正如@mxmissile 在对已接受答案的评论中所说,您不应该新建控制器,因为它将缺少为 IoC 设置的依赖项并且不会具有HttpContext.

相反,您应该像这样获得控制器的实例:

var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext, controller);
于 2015-08-19T14:28:32.233 回答
119

控制器只是类 - 新建一个并像调用任何其他类成员一样调用 action 方法:

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

于 2013-06-01T07:55:59.780 回答
64

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

return RedirectToAction("B", 
                        "FileUploadMsgView",
                        new { FileUploadMsg = "File uploaded successfully" });
于 2013-06-01T07:56:56.523 回答
17

正如@DLeh 所说,宁可使用

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

但是,给控制器一个控制器上下文很重要,尤其是当您需要访问User对象、Server对象或HttpContext“子”控制器内部时。

我添加了一行代码:

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

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

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

于 2016-05-09T15:16:20.860 回答
10

让解析器自动执行此操作。

内部控制器:

public class AController : ApiController
{
    private readonly BController _bController;

    public AController(
    BController bController)
    {
        _bController = bController;
    }

    public httpMethod{
    var result =  _bController.OtherMethodBController(parameters);
    ....
    }

}
于 2017-05-30T23:14:47.983 回答
9

如果有人正在研究如何在 .net 核心中执行此操作,我通过在启动时添加控制器来完成它

services.AddTransient<MyControllerIwantToInject>();

然后将其注入另一个控制器

public class controllerBeingInjectedInto : ControllerBase
{
    private readonly MyControllerIwantToInject _myControllerIwantToInject

     public controllerBeingInjectedInto(MyControllerIwantToInject myControllerIwantToInject)
{
       _myControllerIwantToInject = myControllerIwantToInject;
      }

然后就这样称呼它_myControllerIwantToInject.MyMethodINeed();

于 2018-12-13T21:44:01.217 回答
7

我知道它很旧,但你可以:

  • 创建服务层
  • 将方法移到那里
  • 两个控制器中的调用方法
于 2020-04-23T10:41:41.583 回答
7

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

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

这是失败的代码:

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

值得注意的是,字符串、整数等在使用此控制器方法的过程中幸存下来,但通用列表对象却遭受了让人想起 C 内存泄漏的痛苦。

如上所述,这是我将其替换为的代码:

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

var result = controller.IndexComparison(model);
return result;

现在一切都按预期工作。谢谢你带路。

于 2016-03-28T16:12:48.843 回答
5

Dleh 的回答是正确的,并解释了如何在不丢失为 IoC 设置的依赖项的情况下获取另一个控制器的实例

但是,我们现在需要从另一个控制器调用该方法。
完整的答案是:

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

//Call your method
ActionInvoker.InvokeAction(controller.ControllerContext, "MethodNameFromControllerB_ToCall");
于 2018-06-09T18:24:10.460 回答
3

如果问题是打电话。您可以使用此方法调用它。

yourController obj= new yourController();

obj.yourAction();
于 2017-12-20T05:28:43.873 回答
0

如果你使用 .NET Core 或 .NET 5 < 你可以这样做:

MVC:

services.AddMvc().AddControllersAsServices();

ApiController

services.AddControllers().AddControllersAsServices();

然后你可以像任何其他服务一样简单地注入你的控制器

于 2021-09-15T07:54:50.697 回答