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?
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?
You can do this:
public AController : Controller
{
public ActionResult Bar(BarViewModel vm)
{
FooViewModel fooVm = MakeFooVM(vm);
var bController = new BController();
return bController.Foo(fooVm);
}
}
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.
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);
}
}