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 }

            );
                   
            
        }
    }
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。