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?

4条回答
淡お忘
2楼-- · 2020-04-07 05:43

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);
     }
}
查看更多
等我变得足够好
3楼-- · 2020-04-07 05:44

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楼-- · 2020-04-07 05:49

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?

查看更多
戒情不戒烟
5楼-- · 2020-04-07 05:55

You can do this:

public AController : Controller
{
     public ActionResult Bar(BarViewModel vm)
     {
          FooViewModel fooVm = MakeFooVM(vm);
          var bController = new BController();
          return bController.Foo(fooVm);
     }
}
查看更多
登录 后发表回答