Mvc路由的顺序

来源:互联网 发布:深圳财务培训 知乎 编辑:程序博客网 时间:2024/05/01 21:17

<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地址控制器的后面是跟“-”的,而Default的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 }            );                                       }    }}


0 0
原创粉丝点击