.NET MVC在另一个控制器中实例化控制器

Cod*_*ain 7 asp.net-mvc controller

ASP.NET MVC控制器是否有可能创建不同控制器的新实例并有效地将其重新委托给它?

比方说,我在/ Controllers /目录中有两个控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
            var otherController = new OtherController();
            return otherController.ShowNumberOfThings(100);
    }
}

public class OtherController : Controller
{
        public ActionResult ShowNumberOfThings(int index)
        {
            return View(index);
        }
}
Run Code Online (Sandbox Code Playgroud)

...和一个名为Views/Other/ShowNumberOfThings.aspx的视图:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="ViewPage<int>" %>
Number of things: <%= Model.ToString() %>
Run Code Online (Sandbox Code Playgroud)

当我点击网址时:

HTTP://本地主机/首页/索引

我希望看到一个页面:

"事情数量:100"

我希望能够在控制器重定向之间保留临时数据,而不必强制使用会话对象(TempData [""]使用会话对象进行跨控制器重定向).我的真实案例有一个复杂的对象需要传递(不仅仅是一个int),所以使用URL/Cookie是不可能的,会话状态是禁止的.

在WebForms中,我们至少可以使用Server.Transfer并维护HttpContext.Items集合中的任何状态.在MVC中,我能看到的唯一选择是直接调用控制器方法传递必需的参数.

目前,由于"上下文"仍在HomeController下运行,因此无法尝试解析视图文件夹.

我想我要去的地方就是试图将ASP.NET MVC搞得像FrontContoller一样.

有任何想法吗?

编辑

最后,我们必须将所有内容序列化为一个会话并使用它.遗憾,但我听说MVC2将支持将对象序列化为ViewState.

小智 2

我认为最好使用。

return RedirectToAction("Controller", "Action")
Run Code Online (Sandbox Code Playgroud)

不过我猜你想维护 Url Home/Index。如果您正在查看 FrontController 模式,那么您应该研究编写一个继承自 DefaultControllerFactory 的自定义 ControllerFactory,然后重写 CreateController 方法。您可以使用下面的代码注册您的工厂。

    protected void Application_Start()
    {
        ControllerBuilder.Current.SetControllerFactory(new MyCustomControllerFactory();
        RegisterRoutes(RouteTable.Routes);
    }
Run Code Online (Sandbox Code Playgroud)

在控制器工厂中,您可以访问 RequestContext,因此您可以根据需要更改 RouteData 并委托给正确的控制器。

您当然可以为 Home/Index 设置一个自定义路由,该路由转到 OtherController.ShowNumberOfThings()

routes.MapRoute("Home", "Home/Index/{id}",
                            new {controller = "Other", action = "ShowNumberOfThings", id = 100});
Run Code Online (Sandbox Code Playgroud)