Mvc路由的顺序
<1>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace MvcApplication { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //路由是有顺序的。排在最前的最开始被选择。如果匹配不上就第二条开始选择...直到最后被匹配上为止 //假如我现在又一个Home 控制器 Index方法。 拿以下两条路由规则测试 //测试1 在浏览器中输入 http://localhost:2006/Home/Index //因为Default这条路由是在排在最面前的 所以它最先开始匹配 因为Default的url规则是url: "{controller}-{action}/{id}" //因为我输入的Url地址控制器的后面是跟“/”的,而Default的url规则的控制器后面是跟“-”的所以,这条路没有匹配上。 //因为排在最前面的那条路由没匹配上,那我们来看第二条路由Default2: //因为我输入的Url地址控制器的后面是跟“/”的,而Default2的url规则的控制器后面也是跟“/”的所以就匹配上了。 //匹配上了之后。就去控制器文件夹里找这个Home控制器。如果找到了就继续找Index这个方法。如果也找到了,整条路由规则就算通过了。如果其中的Home控制器,或者Index方法没有找到那么就会报错啦“无法找到资源。 ” //注:只要当前的路由匹配上了,后面路由就不会再继续匹配了。 //测试2 在浏览器中输入 http://localhost:2006/Home-Index //因为Default这条路由规则是排在最面前的 所以它最先开始匹配 因为Default的url规则是url: "{controller}-{action}/{id}" //因为我输入的Url地址控制器的后面是跟“-”的,而Default2的url规则的控制器后面也是跟“-”的所以,这条路由就匹配上了。 //匹配上了之后。就去控制器文件夹里找这个Home控制器。如果找到了就继续找Index这个方法。如果也找到了,整条路由规则就算通过了。如果其中的Home控制器,或者Index方法没有找到那么就会报错啦“无法找到资源。 routes.MapRoute( name: "Default", url: "{controller}-{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); routes.MapRoute( name: "Default2", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } }
<2> 针对上面的测试,我现在将 Default 路由与 Default2 调换一下位置。 将Default2放到最前面 ,看以下的变化
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace MvcApplication { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //路由是有顺序的。排在最前的最开始被选择。如果匹配不上就第二条开始选择...直到最后被匹配上为止 //假如我现在又一个Home 控制器 Index方法。 拿以下两条路由规则测试 //测试1 在浏览器中输入 http://localhost:2006/Home/Index //因为Default2这条路由规则是排在最面前的 所以它最先开始匹配 因为Default2的url规则是url: "{controller}/{action}/{id}" //因为我输入的Url地址控制器的后面是跟“/”的,而Default2的url规则的控制器后面也是跟“/”的所以这条路由就匹配上了。 //匹配上了之后。就去控制器文件夹里找这个Home控制器。如果找到了就继续找Index这个方法。如果也找到了,整条路由规则就算通过了。如果其中的Home控制器,或者Index方法没有找到那么就会报错啦“无法找到资源。 ” //因为第一条路由已经匹配上了。所以后面的路由就不会再继续匹配了。 //测试2 在浏览器中输入 http://localhost:2006/Home-Index //因为Default2这条路由规则是排在最面前的 所以它最先开始匹配。 因为Default2的url规则是url: "{controller}/{action}/{id}" //重点1来了:因为路由规则的控制器是以“/”结尾的,Action方法也是以/结尾的,其他参数,如id也是以“/”结尾的。 //注意:默认的情况下URL的“控制器”和“Action”方法是可以省略的。。所以在浏览器中输入:http://localhost:2006 也是可以解析的,它是 http://localhost:2006/Home/Index 的缩写。 //重点2:当我们在浏览器中输入http://localhost:2006/Home-Index的时候,我们“自以为” 这里的控制器是Home,Action方法是Index。其实不然 //当我们输入http://localhost:2006/Home-Index 的时候它就给“Home-Index”识别成一个控制器了。【注:控制器和Action方法是可以省略的】所以你输入的这条Url实际是被解析成 http://localhost:2006/Home-Index/Index 了 //既然Default2的路由规则规定控制器后面是跟“/”的 而http://localhost:2006/Home-Index/Index这条Url的控制器后面也是跟“/”的 所以就匹配上了 //与是它就去控制器文件夹中去找“Home-Index”这个控制器。结果没找到。所以就会报错“无法找到资源” //备注在当前的路由规则下【假如 这里的控制器是 "Test" Action 方法是“wowo” 你在浏览器中输入 http://localhost:2006/Test-wowo。 你这条Url实际上是被解析成了 http://localhost:2006/Test-wowo/Index】 routes.MapRoute( name: "Default2", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); routes.MapRoute( name: "Default", url: "{controller}-{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。