在每个区域的文件夹中,您会看到一个*AreaName*AreaRegistration.cs
文件。这是存储区域路由规则的地方。默认情况下,当它们生成时,它们将在其他所有内容之前包含区域名称。问题是:如果您从路由中删除区域名称“文件夹”,该路由将捕获所有“标准”{controller}/{ action}/{id} 请求。这显然不是你想要的..
为了克服这个问题,您可以根据该路由中存在的控制器名称在路由上添加正则表达式过滤器。缺点?您将无法在应用程序中拥有两个具有相同名称的控制器(至少不使用标准路由..您总是可以想到不同的路由来访问它们:))
最后..有这个结构:
/Areas
/Areas/Blog/Controllers/BlogController.cs
/Areas/Blog/Controllers/FeedController.cs
/Areas/User/Controllers/UserController.cs
/Controllers/PageController.cs
你应该拥有的是这样的:在 BlogAreaRegistration.cs 中:
context.MapRoute(
"Blog_default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new { controller = "(Blog|Feed)" }
);
在 UserAreaRegistration.cs 中:
context.MapRoute(
"User_default",
"{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional },
new { controller = "(User)" }
);
在 Global.asax.cs 中:
public static void RegisterRoutes(RouteCollection routes)
{
context.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
请注意,在 global.asax 地区注册是第一位的!:)
UPD:
根据您的问题更新:如果您将使用区域,您必须考虑一件事:如果您有区域间链接,您还必须在链接中提供区域名称. 例如
<%: Html.ActionLink("Link text", "Action", "Controller", new { area = "Blog", id = 4, title = "page-title" }); %>
你明白了。
关于多个模型/视图,目前我正在遵循这样的结构
/Code/ // 助手,未移动到库的扩展类
/Models/Data/ // EF 类 + 验证类在这里
/Models/ViewModels/{controller}/ // 查看每个控制器存储的模型
到目前为止,它运行良好,并且我设法使解决方案保持相对有条理。正如我所说,到目前为止我创建的唯一区域是该Admin
区域,因为它与网站的其他部分有很大不同:)