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 }

            );

        }
    }
}
时间: 2024-10-08 13:33:42

Mvc路由的顺序的相关文章

VS2013和VS2015中MVC 区域路由匹配顺序相反

创建测试工程 分别在vs2013和vs2015中创建mvc项目,并创建First.Second.Three三个Area,每个Area下面创建一个HomeController和Index视图.修改RouteConfig.cs中的路由注册方法,添加命名空间 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.M

mvc 路由及部分视图

RouteConfig.cs代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace MvcApplication1 { public class RouteConfig { //定义:路由是定义如何处理客户端请求. //路由名称的设置: 在路由设置中,路由名称是

MVC路由探寻,涉及路由的惯例、自定义片段变量、约束、生成链接和URL等

引子 在了解MVC路由之前,必须了解的概念是"片段".片段是指除主机名和查询字符串以外的.以"/"分隔的各个部分.比如,在http://site.com/Home/Index中,包含2个片段,第一个片段是Home,第二个片段是Index. URL匹配的特点:● 保守的:URL中的片段数量必须和路由规则中的片段数量一致(路由规则没有设置默认值的前提下)● 宽松的:在满足片段数要求的前提下,URL中的片段内容是宽松的 本篇涉及的方面包括:1.路由惯例2.自定义片段变量3

Asp.Net MVC 路由 【转】

原文链接:http://www.asp.net/learn/mvc/ 在这篇教程中,我将为你介绍每个ASP.NET MVC应用程序都具有的一个重要功能,称作ASP.NET路由(ASP.NET Routing).ASP.NET路由模块负责将即将到来的浏览器请求映射到特定的MVC控制器动作.学完这篇教程之后,你将会理解标准的路由表是如何将请求映射到控制器动作的. 1. 理解默认路由表 当你创建一个新的ASP.NET MVC应用程序时,应用程序已经被配置为使用ASP.NET路由.ASP.NET路由在两

【ASP.NET MVC 牛刀小试】 ASP.NET MVC 路由

例子引入 先看看如下例子,你能完全明白吗? 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 using System.Web.Routing; 7 8 namespace MVCDemo 9 { 10 public class RouteConfig 11 { 12 public static void Re

asp.net MVC 路由机制 Route

1:ASP.NET的路由机制主要有两种用途: -->1:匹配请求的Url,将这些请求映射到控制器 -->2:选择一个匹配的路由,构造出一个Url 2:ASP.NET路由机制与URL重写的区别 -->Url重写关注的是将一个Url映射到另一个Url. 路由机制关注的是将Url映射到资源上.资源不一定是一个物理页面,可以是类中的方法. -->Url重写只能用于传入的请求Url 路由机制可以匹配传入的Url,也能够生成一个Url -->Url重写大多是IIS级别的,是IIS的一个组

ASP.NET Core中使用默认MVC路由

ASP.NET Core里Route这块的改动不大,只是一些用法上有了调整,提供了一些更加简洁的语法. 而对于自定义路由的支持当然也是没有问题的,这个功能应该是从MVC1.0版本就已经有这个功能. 先看看ASP.NET Core里面实现默认MVC路由的配置方式 通常情况下,在使用MVC项目的时候,默认的路由就足够了,就是常见的通过Controller和Action获取具体的方法的方式. 从一个最基本的项目开始,执行以下步骤,就可以使得项目支持MVC路由 1.创建一个空白的ASP.NET Core

[Buffalo]ASP.NET MVC路由映射

Asp.Net的路由系统旨在通过注册URl模版与物理文件之间的映射进而实现请求地址与文件路径之间的分离,但对于Asp.Net Mvc应用来说,请求的目标却是定义在某个Controller类型中的Action方法. 为了实现针对目标Controller和Action的路由,Asp.Net Mvc在System.Web.Mvc.RouteCollectionExtensions中针对RouteConllection类型定义了一系列的扩展方法以实现文件路径无关的路由映射.其中的两组方法,Ignore用

ASP.NET MVC - 路由系统

ASP.NET MVC的请求URL不再对应于传统ASP.NET程序的ASPX文件物理地址,而是把请求映射到一个控制器(Controller)类的方法(Action)上,Controller.Action再加上参数构成ASP.Net MVC请求的Url.下面我们来看下路由系统的主要对象. UrlRoutingModule ASP.NET MVC框架的路由实质是从传统ASP.NET管道扩展HttpModule而来,这个模块正是UrlRoutingModule.通过反编译可以看到UrlRoutingM