ASP.NET MVC Beta - 分组控制器和视图可能吗?

时间:2008-10-23 19:53:16

标签: asp.net asp.net-mvc asp.net-mvc-routing

我正在使用最新的beta版本构建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在这里问的那样:Under an MVC framework, which directory structure would be expected by other developers?

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

3 个答案:

答案 0 :(得分:1)

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

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

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。

答案 1 :(得分:1)

我刚写了一篇博客文章,描述了一种将控制器分组的方法,类似于单轨列车中的“区域”。但它并没有解决嵌套区域。

http://haacked.com/archive/2008/11/04/areas-in-aspnetmvc.aspx

答案 2 :(得分:0)

这不是一个新概念。它在Monorail中称为“区域”。最近在ATL.NET forum和其他地方有很多关于这个话题的讨论。史蒂夫桑德森提出了一个way to do this,但显然它留下了一些问题。在重新回复中,显然MVC团队将在未来版本中使用“deep look”。