到您的区域的自定义路线应该在您的 AreaRegistration 类中注册而不是在 Global.asx.cs
添加路由修改您的NewsAreaRegistration
并在区域路由之后将新的默认路由添加到您的服务器。(这里的顺序很重要!)
默认路由应始终位于路由表的底部,以便匹配更具体的路由。
您在方法中的路线RegisterArea
应如下所示:
context.MapRoute(
"News_default",
"News/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
context.MapRoute(
"DefaultStart",
"",
new { controller = "Articles", action = "IndexOfArticles"}
);
更新:忘了提到您需要确保您Application_Start
在 Global.asx.cs 文件的方法中注册了您的区域。
AreaRegistration.RegisterAllAreas();
更新 2:路由在 ASP.NET MVC 中的工作原理
我理解你的担心。让我简要解释一下路由是如何工作的。
在 ASP.NET MVc 中,有一个路由表用于匹配所有 url 请求。
当您在 Global.asx.cs 或 AreaRegistration 中注册路由时,这些路由会按照它们注册的顺序添加到路由表中(这就是顺序很重要的原因,我们应该将更具体的路由推到顶部,以便它们可以匹配)。
当涉及到区域路线(在AreaRegistration
课程中注册的路线)。这些总是在 Global.asx.cs 文件中注册的任何路由之前添加到路由表的顶部(区域路由是第一个匹配的路由),因为否则您将错过匹配名为 News 的区域一个名为 News 的控制器。
如果您有多个区域,首先检查哪个区域的路线?我不是 100% 确定,但是通过实验我发现它们是按创建时间排序的,旧区域首先位于路由表的顶部。(这并不重要,因为你不会有两个同名的区域)
例子:
假设您创建了以下区域。News
, Dashboard
,Api
并将以下路由添加到您的 NewsAreaRegistration 以匹配根路由,如上面的示例所示
context.MapRoute(
"DefaultStart",
"",
new { controller = "Articles", action = "IndexOfArticles"}
);
您的路由表将如下所示:
No Route Name URL Explanation
1 News_default News/{controller}/{action}/{id} Default For News Area
2 DefaultStart (empty) Root Route (match root url)
3 Dashboard_default Dashboard/{controller}/{action}/{id} Default For Dashboard Area
4 Api_default Api/{controller}/{action}/{id} Default For Api Area
5 Default {controller}/{action}/{id} Default (No Areas)
现在,当您的应用程序收到请求时。它将逐个遍历路线并寻找匹配项。在我们的例子中,当您请求根 url 时。第二条路线将被匹配。并且因为我们为 controller = "Articles" 和 action ="IndexOfArticles" 设置了默认值,所以请求将被相应地重定向。
希望这会有所帮助。