我正在使用最新的测试版构建 ASP.NET MVC 应用程序,我想知道是否可以更改默认项目布局

/Views/Home/Index.aspx /Views/Home/About.aspx

/Blog/Views/Home/Index.aspx /Blog/Views/Home/About.aspx

/Forum/Views/Home/Index.aspx /Forum/Views/Home/About.aspx

目标是在一个 Web 项目中实现“应用程序”之间的某种分离,就像 Thomas Owens 在这里已经提出的那样: 在 MVC 框架下,其他开发人员期望哪种目录结构?

当然,这还应该包括控制器,而不仅仅是视图。

有帮助吗?

解决方案

这不是一个新概念。它被称为“区域”。在单轨列车。最近在 ATL.NET论坛上关于此主题的讨论很多。 和其他地方。史蒂夫桑德森提出了一个这样做的方式但显然它留下了一些问题。在重新回复中,显然MVC团队将采取“深入了解"在它的未来发布。

其他提示

是的,应该可以做到这一点。我能想到一个办法;可能还有其他人。

第一步是修改默认路由以包含您的应用程序名称:

routes.MapRoute("Default",
                "{applicationName}/{controller}/{action}/{id})",
                null, null);

我假设您要将两个“应用程序”分组到单个程序集中的不同命名空间中。所以你可能有两个命名空间,例如:

  • MyApp.Blog.Controllers
  • MyApp.Forum.Controllers

接下来,您需要更改控制器工厂,以便它实例化正确的控制器。您可以通过对 DefaultControllerFactory 进行子类型化并重写 GetControllerType 方法来完成此操作:

    protected override System.Type GetControllerType(string controllerName)
    {
        string applicationName;
        if (RequestContext != null && 
           RequestContext.RouteData.Values.TryGetValue(
           "applicationName", out applicationName)) {
           // return controller type using app name to 
           // look up namespace and controllerName argument
           return ...
        }

        // if no match, maybe it's a different controller/route
        return base.GetControllerType(controllerName);
    }

最后,您需要告诉 MVC 使用您的 ControllerFactory。在 Global.asax.cs 中:

    private void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(RouteTable.Routes);
        ControllerBuilder.Current.SetControllerFactory(
            MyApp.MyControllerFactory());
    }

定位视图可以类似地处理。在本例中,您将创建 WebFormViewEngine 的子类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top