【问题标题】:Is there a way to return an ActionResult from Controller B called from Controller A while providing a specific model to B?有没有办法在向 B 提供特定模型的同时从控制器 A 调用的控制器 B 返回 ActionResult?
【发布时间】:2016-04-08 01:49:37
【问题描述】:

假设我有一个控制器:

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 中实现这一点?

【问题讨论】:

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


    【解决方案1】:

    上面的答案中缺少一个步骤。创建控制器后,您需要设置 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?

    【讨论】:

    • 如果您尝试从其他控制器操作返回部分视图结果,这将不起作用,因为路由数据将来自原始控制器。
    【解决方案2】:

    你可以这样做:

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

    【讨论】:

    • 我想到了这一点,但我不确定在 MVC 中是否可以接受从框架“外部”适当地实例化控制器。
    【解决方案3】:

    看看这个 URL,它解释了如何在从一个动作重定向到另一个动作时传递参数:http://jonkruger.com/blog/2009/04/06/aspnet-mvc-pass-parameters-when-redirecting-from-one-action-to-another/

    希望这对你有帮助。

    【讨论】:

    • 在我看来,使用您提到的技术需要下载第三方代码库。对吗?
    • @Dejas,你必须为你的控制器使用 PassParametersDuringRedirect 属性
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2012-12-12
      • 2010-10-11
      • 2020-03-03
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 2013-10-07
      相关资源
      最近更新 更多