代码之家  ›  专栏  ›  技术社区  ›  Codebrain

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

  •  7
  • Codebrain  · 技术社区  · 15 年前

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

    …和名为VIEWS/Other/ShowNumberOfhings.aspx的视图:

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

    当我点击网址时:

    http://localhost/Home/Index

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

    “数量:100”

    我希望能够在控制器重定向之间保留临时数据,而不必强制使用会话对象(tempdata[“”]使用会话对象进行跨控制器重定向)。我的现实世界中有一个复杂的对象需要传递(不仅仅是int),因此使用URL/cookie是不可能的,会话状态是no-no。

    在webforms中,至少我们可以使用server.transfer并维护httpcontext.items集合中的任何状态。在MVC中,我能看到的唯一选项是直接调用控制器方法来传递所需的参数。

    目前,由于“上下文”仍在主控制器下运行,因此在尝试解决视图文件夹时遇到问题。

    我想我要做的是尝试将ASP.NET MVC归纳为 FrontContoller .

    有什么想法吗?

    编辑

    最后,我们必须把每件事都序列化成一个会话并使用它。很遗憾,但我听说MVC2将支持将对象序列化为视图状态。

    4 回复  |  直到 11 年前
        1
  •  2
  •   willbt    15 年前

    我想最好用。

    return RedirectToAction("Controller", "Action")
    

    不过,我猜想您希望维护URL主页/索引。 如果您查看的是FrontController模式,那么您应该研究编写一个继承自DefaultControllerFactory的自定义ControllerFactory,然后重写CreateController方法。 您可以使用下面的代码注册工厂。

        protected void Application_Start()
        {
            ControllerBuilder.Current.SetControllerFactory(new MyCustomControllerFactory();
            RegisterRoutes(RouteTable.Routes);
        }
    

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

    当然,您可以为home/index设置一个自定义路由,该路由指向OtherController.ShowNumberOfthings()。

    routes.MapRoute("Home", "Home/Index/{id}",
                                new {controller = "Other", action = "ShowNumberOfThings", id = 100});
    
        2
  •  3
  •   Darin Dimitrov    15 年前

    如果要在单击索引操作时显示“事物数:100”,为什么不直接呈现相应的视图:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View("~Views/Other/ShowNumberOfThings.aspx", 100);
        }
    }
    
        3
  •  1
  •   freddoo    15 年前

    另一种方法是使用局部视图

    而不是 ~Views/Other/ShowNumberOfThings.aspx

    你可以把视野放进去 ~Views/shared/ShowNumberOfThings.ascx

    两面都有 ~视图/其他/shownumberofthings.aspx ~Views/Home/Index.aspx 实现局部视图

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
                return View(100);
        }
    }
    
    public class OtherController : Controller
    {
            public ActionResult ShowNumberOfThings(int index)
            {
                return View(index);
            }
    }
    

    在这两个视图中实现部分视图

    <% Html.RenderPartial("~Views/shared/ShowNumberOfThings.ascx", ViewData.Model); %>
    

    可以更改将传递给模型的任何对象的int

        4
  •  0
  •   Clay hemu    12 年前

    另一种可能性(类似于局部视图)是使用 Html.RenderAction . 这允许不同的视图模型类和单独的控制器方法。

    <% Html.RenderAction("yourActionName", "yourControllerName", routeValues); %>