在每个区域的文件夹中,您会看到一个*AreaName*AreaRegistration.cs
文件。这是存储区域路由规则的地方。默认情况下,当它们生成时,它们将包含区域名称之前的一切。问题是:如果从路由中删除区域名称“文件夹”,路由将捕获所有“标准”{控制器}/{操作}/{id}请求。这显然不是你想要的。
为了克服这个问题,你可以在路由上添加正则表达式过滤器,这个过滤器基于那个路由中存在的控制器名称。缺点?你将无法在应用程序中拥有两个同名的控制器(至少不使用标准路线..你总是可以想到不同的路线来访问它们:))
最后..具有这种结构:
/地区
/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" }); %>
你明白了。
关于多个模型/视图,此刻,我喜欢以下结构的本
/代码/ //帮手,没有被转移到库
/模型/数据扩展类/ //该EF类+验证类在这里每个控制器存储
到目前为止,它工作正常
/模型/的ViewModels/{}控制器/ //视图模型,我设法保持相对有组织的解决方案。正如我所说,我创建至今的唯一区域是Admin
区域,因为它是是从网站:)其余太大的不同
出于好奇,如果你不想额外的文件夹,为什么要实现你的应用程序? – GalacticCowboy 2010-04-21 11:04:46
Btw ..不要过度使用路线.. 如果您制作的区域只有一个控制器,那么您确定首先需要一个单独的区域吗? :) – 2010-04-21 11:06:30
@GalacticCowboy,Artiom:好点,并且在上面添加了更多评论......看起来好像区域可能不是要走的路,或者当我们需要开始组织更大/特定的部分时,开始使用区域。 – 2010-04-21 12:55:30