ASP.NET MVC Controller 是否可以创建其他 Controller 的新实例,并有效地将响应性委派给该实例?

例如,假设我在/Controllers/目录中有两个 Controller :

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

...以及一个名为Views/Other/ShowNumberOfThings.aspx的 View :
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="ViewPage<int>" %>
Number of things: <%= Model.ToString() %>

当我点击网址时:

http://localhost/Home/Index

我想看到一个页面,上面写着:

“事物数:100”

我希望能够在 Controller 重定向之间保留临时数据,而不必被迫使用 session 对象(TempData [“”]使用 session 对象进行跨 Controller 重定向)。我的真实案例中有一个复杂的对象需要传递(而不仅仅是一个int),因此使用URL/Cookie是不可能的,并且 session 状态是不行的。

至少在WebForms中,我们可以使用Server.Transfer并维护HttpContext.Items集合中的任何状态。在MVC中,我只能看到的唯一方法是直接传入所需的参数来调用 Controller 方法。

目前,由于“上下文”仍在HomeController下运行,因此尝试解析 View 文件夹时遇到了麻烦。

我猜想我要去解决的问题是试图使ASP.NET MVC像FrontContoller一样起作用。

有任何想法吗?

编辑

最后,我们必须将所有内容序列化为 session 并使用它。很遗憾,但是我听说MVC2将支持将对象序列化为ViewState。

最佳答案

我认为将首选使用。

return RedirectToAction("Controller", "Action")

但是我猜您想维护网址首页/索引。
如果您正在查看FrontController模式,则应该研究编写自DefaultControllerFactory继承的Custom ControllerFactory,然后重写CreateController方法。
您可以使用以下代码注册工厂。
    protected void Application_Start()
    {
        ControllerBuilder.Current.SetControllerFactory(new MyCustomControllerFactory();
        RegisterRoutes(RouteTable.Routes);
    }

在Controller工厂中,您可以访问RequestContext,因此可以根据需要更改RouteData并将其委托(delegate)给正确的 Controller 。

您当然可以为Home/Index设置一个自定义路由,该路由将转到OtherController.ShowNumberOfThings()
routes.MapRoute("Home", "Home/Index/{id}",
                            new {controller = "Other", action = "ShowNumberOfThings", id = 100});

关于asp.net-mvc - .NET MVC在另一个 Controller 中实例化 Controller ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1498293/

10-12 00:00
查看更多