我有一个MumStation控制器,然后添加了一个同名的Area 是MumStation,在这个Area里面还有一个MumStation控制器。然后我把路由配置都改成有namesapce的重载的了。然后情况如下:
1、我默认路由默认的首页是MumStation控制器的index页面,可以访问。
2、我浏览MumStation/MumStation/index页面可以浏览(Area里面的页面)。
3、我浏览MumStation/index页面报404(控制器的页面)。
这是为什么?
然后我把MumStation这个Area的路由里面的url改成了如下:
public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "MumStation_default", "Mum/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional }, new string[] { "CCP_Second.Areas.MumStation.Controllers" } ); }
这个时候我访问Area里的MumStation的Index页面应该是/mum/Mumstation/index了吧?这是可以正常访问的。然后我访问控制器的Index即MumStation/index居然也可以访问了。
那么又有一个问题:
在MVC管道第7.8事件的时候通过注册的路由配置,查找是否存在对应文件。现在我有两个路由规则,一个是默认的Default还有一个是MumStation_default。这个时候程序是怎么根据这两个规则匹配的?我现在的理解是:
先按照Default的规则查找,如果找到了就结束,如果没有找到就在按照MumStation_default的找,如果还没有找到就是404了。
但是上述发生的情景和我现在理解的不一致,请问可以详细帮我解释一下原理吗?
路由规则是在你的配置中从上往下找,找到第一个匹配的就返回了
补充一下:
如果现在你有ABCD4个路由规则,现在有一个url。url先去看看第一个规则,看看是否符合这个规则的要求,如果符合就这个阶段结束了,如果没有符合的就继续往下找。
找到符合规则的之后就按照这个规则来找控制器和action。如果找到了就ok。如果没有找到那么就是404.
一般Default是放最下面的。