Is there a way to return an ActionResult from Cont

2020-04-07 04:54发布

问题:

Let's say I have a controller:

public BController : Controller
{
    public ActionResult Foo(FooViewModel vm)
    {
       ...
    }
 }

and at the same time I'm implementing an action in another controller AController where I want to render the result of BController.Foo passing a specific model object. So:

public AController : Controller
{
     public ActionResult Bar(BarViewModel vm)
     {
          FooViewModel fooVm = MakeFooVM(vm);
          return ... ; // pass fooVm to BController
     }
}

Is there a way to accomplish this in MVC?

回答1:

Missing a step in the answer above. After you create the controller, you need to set the ControllerContext so that the controller's Request, Response, and HttpContext will be populated. Just creating the controller will result in null values for the controller's context settings.

public AController : Controller
{
     public ActionResult Bar(BarViewModel vm)
     {
          FooViewModel fooVm = MakeFooVM(vm);
          var bController = new BController();
          bController.ControllerContext = new ControllerContext(this.ControllerContext.RequestContext, bController);
          return bController.Foo(fooVm);
     }
}

Source: Get ActionResult of another controller-action?



回答2:

You can do this:

public AController : Controller
{
     public ActionResult Bar(BarViewModel vm)
     {
          FooViewModel fooVm = MakeFooVM(vm);
          var bController = new BController();
          return bController.Foo(fooVm);
     }
}


回答3:

Have a look at this URL which explains how to pass parameters when redirecting from one action to another: http://jonkruger.com/blog/2009/04/06/aspnet-mvc-pass-parameters-when-redirecting-from-one-action-to-another/

Hope this is helpful for you.



回答4:

An update to @WWC's answer that will help the target action be able to find the view it needs.

public AController : Controller
{
     public ActionResult Bar(BarViewModel vm)
     {
          FooViewModel fooVm = MakeFooVM(vm);
          var bController = new BController();
          var bControllerContext = new ControllerContext(this.ControllerContext.RequestContext, bController);
          // update route so action can find the (partial)view
          bControllerContext.RouteData.Values["controller"] = "B";
          bController.ControllerContext = bControllerContext;
          return bController.Foo(fooVm);
     }
}