【问题标题】:MVC 3 get ActionResult of an action that is defined on a different controllerMVC 3 获取在不同控制器上定义的操作的 ActionResult
【发布时间】:2012-05-30 12:30:47
【问题描述】:

问题:

我需要的是类似于 @Html.RenderAction("action","controller") 的东西,但我可以在不同的控制器中使用它。例如:

public class FirstController : Controller
{
   public ActionResult GetErDone()
   {
        return View();
   }
}

public class SecondController : Controller
{
   public ActionResult Index()
   {
        ActionResult coolResult = 
               Helper.GetActionResult("GetErDone", "FirstController");

        return View();
   }
}

进展:

我已经开始剥离/改革实际的@Html.Action() 方法,但它确实有太多的内部辅助依赖项,我认为这不应该那么难。到目前为止我所拥有的是:

    private void TestCreateActionFromDifferentController(RouteValueDictionary routeValues, string controllerName, string actionName)
    {
        var httpContext = this.HttpContext;
        var routeData = this.RouteData;
        routeData.Values["action"] = (object)actionName;

        if (!string.IsNullOrEmpty(controllerName))
            routeData.Values["controller"] = (object)controllerName;

        IController myController = ControllerBuilder.Current.GetControllerFactory().CreateController(new RequestContext(httpContext, routeData) , "staticpages");
    }

这当然可以部分工作(减去区域数据令牌等许多缺点),但除了反射之外没有其他方法可以到达 MyActionResult 对象。

总结:

在控制器内部时,有什么方法可以从在不同控制器上定义的动作中获取 ActionResult?

更新:

更具体地说,我正在尝试使用 System.Web.Mvc.Html.ChildActionExtensions.ChildActionMvcHandler 之类的东西,但它不会执行,而是返回 ActionResult

【问题讨论】:

  • 感谢链接,但是:我不需要 RenderView,我需要创建一个 ActionResult 对象的实例(更类似于此是呈现一个动作 -与渲染视图仍然不同)。另外,我不需要返回一个字符串,我需要返回一个 ActionResult(它需要 controllerContext 因此它不能被重构)。这是非常具体和非常不同的
  • 你到底想用这个来完成什么?您是否尝试将多个操作混搭在一起?
  • 主要设计原因是我想在运行时管理依赖项。想象一个依赖解析层,它位于表示层之前(在发送到视图之前)

标签: asp.net-mvc reflection asp.net-mvc-routing controller-factory


【解决方案1】:

不确定为什么要从另一个 controller 返回 ActionResult。可能您可以提供更多详细信息来了解我们的问题域。

我认为您可以考虑使用BaseController 并声明一个带有返回结果的静态方法GetErrorDone

这个方法可以从AllChild Controllers调用。


或第二个答案

考虑使用 Controller.RedirectToAction 将其重定向到所需的操作

e.g. RedirectToAction("action name" "controller Name")

【讨论】:

  • 感谢您的回复,但是共享方法对我的情况没有帮助。我需要创建许多部分然后组合它们。
  • 一个动作结果表示框架将代表动作方法执行的“命令”。你的命令是什么?它将返回给 View 什么?
  • 这正是问题所在——我不希望 ActionResult 直接返回给 View,我希望 ActionResult 返回给 Controller。我只想将收集所有子 ActionResult 的责任转移到控制器级别,而不是视图级别。 IE:而不是(在剃须刀上)@Html.Action([获取主菜单]),@Html.Action([获取侧栏])等......我想在主控制器上获取所有组件
猜你喜欢
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多