ASP.NET MVC Beta - 可以对控制器和视图进行分组吗?
-
04-07-2019 - |
题
我正在使用最新的测试版构建 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 的子类型。
我刚写了一篇博客文章,描述了一种将控制器分组的方法,类似于“区域”。在单轨铁路。但它并没有解决嵌套区域。
http://haacked.com/archive/2008 /11/04/areas-in-aspnetmvc.aspx