有没有办法从控制器A调用控制器B返回ActionResult,同时向B提供特定模型?

时间:2011-03-08 05:00:37

标签: asp.net-mvc asp.net-mvc-3

假设我有一个控制器:

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

同时我在另一个控制器AController中实现一个动作,我想渲染BController.Foo传递特定模型对象的结果。所以:

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

有没有办法在MVC中实现这一目标?

4 个答案:

答案 0 :(得分:5)

在上面的答案中错过了一步。创建控制器后,需要设置ControllerContext,以便填充控制器的Request,Response和HttpContext。只是创建控制器将导致控制器的上下文设置为空值。

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);
     }
}

来源:Get ActionResult of another controller-action?

答案 1 :(得分:0)

你可以这样做:

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

答案 2 :(得分:0)

请查看此网址,其中说明了从一个操作重定向到另一个操作时如何传递参数:http://jonkruger.com/blog/2009/04/06/aspnet-mvc-pass-parameters-when-redirecting-from-one-action-to-another/

希望这对你有所帮助。

答案 3 :(得分:0)

@WWC's answer的更新,有助于目标操作找到所需的视图。

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);
     }
}