如何正确配置MVC Area路由?将主路由设为启动默认路由的方法
解决ASP.NET MVC默认路由被区域路由抢占的问题
这问题我太熟悉了!核心原因是ASP.NET MVC的路由匹配是按注册顺序来的——先注册的路由规则会先被匹配,而你的区域路由刚好比主路由更早被加入到路由表,所以启动访问根路径时,优先触发了区域路由的默认规则。
给你两种靠谱的解决方案,按需选择:
方案一:调整路由注册顺序(快速解决)
默认情况下,项目的Global.asax里是先注册所有区域路由,再注册主路由。你只需要把主路由的注册放在区域路由之前,就能让主路由的规则先被匹配:
原来的Application_Start代码:
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); // 先注册区域路由 RouteConfig.RegisterRoutes(RouteTable.Routes); // 后注册主路由 // 其他初始化代码 }
修改后:
protected void Application_Start() { RouteConfig.RegisterRoutes(RouteTable.Routes); // 先注册主路由 AreaRegistration.RegisterAllAreas(); // 后注册区域路由 // 其他初始化代码 }
这样根路径访问时,会先匹配到主路由的默认规则,跳转到Department/Index。
方案二:给区域路由添加专属前缀(更规范,推荐)
其实你的区域路由写法不太规范——没有给它加上区域专属的URL前缀,导致它的路由模板{controller}/{action}/{id}和主路由完全一致,才会出现抢路由的情况。
修改你的区域路由配置,给它加上区域名称作为URL前缀,同时添加区域约束,确保它只处理该区域的请求:
context.MapRoute( "Employee_default", "Employee/{controller}/{action}/{id}", // 加上区域名称作为URL前缀 new { Controller = "EmployeeHome", action = "Index", id = UrlParameter.Optional }, new { area = "Employee" } // 添加区域约束,限定该路由仅匹配Employee区域的请求 );
这样一来,只有访问/Employee/xxx这类路径时才会触发区域路由,根路径自然会走主路由的默认规则,从根源上避免了路由冲突。
内容的提问来源于stack exchange,提问作者user8518202
相关产品推荐
相关产品推荐

