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

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

  •  8
  • Codebrain  · 技术社区  · 16 年前

    ASP是否可行。NET MVC控制器创建一个不同控制器的新实例,并有效地委派其合理性?

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

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

    当我点击url时:

    http://localhost/Home/Index

    至少在WebForms中,我们可以使用服务器。传输和维护HttpContext中的任何状态。物品收集。在MVC中,我能看到的唯一选择是直接调用控制器方法,传递所需的参数。

    目前,它在尝试解析视图文件夹时遇到了问题,因为“上下文”仍在HomeController下运行。

    我想我要做的是尝试了解ASP。NET MVC变成了一个 FrontContoller .

    编辑

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

    4 回复  |  直到 12 年前
        1
  •  2
  •   willbt    16 年前

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

    我认为最好使用它。

    return RedirectToAction("Controller", "Action")
    

    但是,我猜你想维护Url主页/索引。 您可以使用下面的代码注册您的工厂。

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

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

    routes.MapRoute("Home", "Home/Index/{id}",
                                new {controller = "Other", action = "ShowNumberOfThings", id = 100});
    
        3
  •  1
  •   freddoo    16 年前

    而不是 ~Views/Other/ShowNumberOfThings.aspx

    ~Views/shared/ShowNumberOfThings.ascx

    ~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); %>
    

        4
  •  0
  •   Clay hemu    13 年前

    另一种可能性(类似于局部视图)是使用 Html.RenderAction

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