一、路由常规设置
1、URL模式
    路由系统用一组路由来实现它的功能。这些路由共同组成了应用程序的URL架构或方案。
URL的两个关键行为:
    a.URL模式是保守的,因而只匹配与模式具有相同片段数的URL。
    b.URL模式是宽松的,如果一个URL正好居右正确的片段数,该模式就会用来为片段变量提取值,而不管这个值可能是什么。
 
2、使用静态URL片段
            //Controller会加上X
            routes.MapRoute("", "X{controller}/{action}",
                new { controller = "Product", action = "Index" });
 
            //会导航到Store这个控制器中,而不会导航到Product控制器
            routes.MapRoute("Store", "Store/{action}",
                new { controller = "Product" });
 
            routes.MapRoute("", "{controller}/{action}",
                new { controller = "Product", action = "Index" });
 
            //路由的格式必须是Public/开头
            routes.MapRoute("", "Public/{controller}/{action}",
                new { controller = "Product", action = "Index" });
 
3、定义自定义片段变量
       /*
         如果在URL中没有{id}这个片段,默认下会把DefaultId赋值给id
        */
            routes.MapRoute("", "{controller}/{action}/{id}",
                new { controller = "Product", action = "Index" ,id="DefaultId"});
 
4、定义可选URL片段
    //id默认值是UrlParameter.Optional,表明片段变量是可选的
routes.MapRoute("", "{controller}/{action}/{id}",
                new { controller = "Product", action = "Index" ,id=UrlParameter.Optional);
 
 
5、定义可变长路由
/*
改变URL模式默认保守性的另一种方式是接收可变数目的URL片段。通过一个全匹配(catchall)的片段变量,并以星号(*)作为其前缀,便可以定义对可变片段数的支持。
*/
    routes.MapRoute("", "{controller}/{action}/{id}/{*catchall}",
                new { controller = "", action = "", id = UrlParameter.Optional });
 
6、按命名空间区分控制器优先顺序
             routes.MapRoute("", "{controller}/{action}/{id}/{*catchall}",
                new { controller = "", action = "", id = UrlParameter.Optional },
                /*这句话的作用:让mvc框架首先去AdditionalControllers这个命名空间下找控制器,
                 *如果没找到合适的控制器,mvc框架默认会回到正常行为。
                 */
                new[] { "URLsAndRoutes.AdditionalControllers" });
 
    禁用备用命名空间
    Route myRoute = routes.MapRoute("", "{controller}/{action}/{id}/{*catchall}",
                new { controller = "", action = "", id = UrlParameter.Optional }
                new[] { "URLsAndRoutes.AdditionalControllers" });
            /*这句话是指如果AdditionalControllers命名空间下没有相匹配的控制,请求会失败。*/
            myRoute.DataTokens["UseNamespaceFallback"] = false;
 
二、约束路由
1、用正则表达式约束路由、将一条路有约束到一组指定的值
Route myRoute = routes.MapRoute("", "{controller}/{action}/{id}/{*catchall}",
                new { controller = "", action = "", id = UrlParameter.Optional },
                /*controller = "^H.*"   用正则表达式来约定路由,它只匹配以H开头的控制器;
                 *action只匹配Index或About的URL。
                 */
                new { controller = "^H.*", action = "^Index$|^About$" });
 2、使用HTTP方法约束路由
 routes.MapRoute("", "{controller}/{action}/{id}/{*catchall}",
                new { controller = "", action = "", id = UrlParameter.Optional },
                /*
                 *httpMethod只允许GET请求。
                 */
                new
                {  httpMethod = new HttpMethodConstraint("GET") },
                new[] { "URLsAndRoutes.AdditionalControllers" });
3、使用类型和值约束
routes.MapRoute("", "{controller}/{action}/{id}/{*catchall}",
                new { controller = "", action = "", id = UrlParameter.Optional },
                /*
                 *id是10到20之间的一个数字。
                 */
                new
                { id= new RangeRouteConstraint(10,20) },
                new[] { "URLsAndRoutes.AdditionalControllers" });
 
4、定义自定义约束
 public class UserAgentConstraint : IRouteConstraint
    {
        private string requiredUserAgent;
        public UserAgentConstraint(string agentParm)
        {
            requiredUserAgent = agentParm;
        }
 
        /// <summary>
        /// 确定 URL 参数是否包含此约束的有效值。
        /// </summary>
        /// <param name="httpContext">一个对象,封装有关 HTTP 请求的信息</param>
        /// <param name="route">此约束所属的对象</param>
        /// <param name="parameterName">正在检查的参数的名称</param>
        /// <param name="values">一个包含 URL 的参数的对象</param>
        /// <param name="routeDirection">一个对象,指示在处理传入请求或生成 URL 时,是否正在执行约束检查</param>
        /// <returns>如果 URL 参数包含有效值,则为 true;否则为 false</returns>
        public bool Match(HttpContextBase httpContext, Route route, string parameterName,
            RouteValueDictionary values, RouteDirection routeDirection)
        {
            bool flag = false;
            //判断处理客户端UserAgent属性
            flag = httpContext.Request.UserAgent != null
                && httpContext.Request.UserAgent.Contains(requiredUserAgent);
            return flag;
        }
    }
//只匹配来自用户代理字符串含有Chrome的浏览器请求。

routes.MapRoute("", "{*cathcall}",
                new { controller = "Product", action = "Index" },
                new { customConstraint = new UserAgentConstraint("Chrome") },

                new[] { "URLsAndRoutes.AdditionalControllers" });
 
三、使用属性路由
1、启用和运用属性路由
在RegisterRoutes方法中加入这一句:routes.MapMvcAttributeRoutes();这样就可以使用属性路由。例如:
//[RoutePrefix("Homes")]//前缀,在Url中会加入 Homes 例:http://localhost:11236/Homes/Home/List/11-124
    public class HomeController : Controller
    {
        //
        // GET: /Home/
        public ActionResult Index(int id = 8)
        {
            ViewBag.ControllerName = "Home";
            ViewBag.ActionName = "Index";
 
            return View();
        }
 
 
        //[Route("Home/List/{id:int}-   
        [Route("~/Test")]
        public ActionResult List(int id = 8)
        {
            ViewBag.ControllerName = "Home";
            ViewBag.ActionName = "List";
            //ViewBag.Id = RouteData.Values["id"];//只能获取到路由中定义的{id}
            ViewBag.Id = id;
            return View();
        }
    }
 
 默认的mvc路由:

     public static void RegisterRoutes(RouteCollection rotues){
          routes.MapRoute(
                    "Default",
                     "{controller}/{action}/{id}",
                     new {controller="Home",action="Index",id=Urlparameter.Optional}
               );
     }
不带参数的路由:
     routes.MapRoute
(
"NoParameter",
"{controller}/{action}/{id}"
);
三.带命名空间的路由
 routes.MapRoute(
"AdminControllers", // 路由名称
"{controller}/{id}-{action}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 参数默认值
new string[] { "Admin.Controllers" }//命名空间
);
四.带约束的路由规则(约束的意思就是用正则这类约束必须符合条件才可以)
routes.MapRoute(
"RuleControllers",
"{controller}/{action}-{Year}-{Month}-{Day}}",
new { controller = "Home", action = "Index", Year = "2010", Month = "04", Day = "21" },
new { Year = @"^\d{4}", Month = @"\d{2}" } //4位数 2位数
);
五.带名称空间,带约束,带默认值的路由规则
routes.MapRoute(
"Rule1",
"Admin/{controller}/{action}-{Year}-{Month}-{Day}",
new { controller = "Home", action = "Index", Year = "2010", Month = "04", Day = "21" },
new { Year = @"^\d{4}", Month = @"\d{2}" },
new string[] { "Admin.Controllers" }
);
六.捕获所有的路由
routes.MapRoute(
"All", // 路由名称
"{*Vauler}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
 
 

mvc路由的更多相关文章

  1. ASP.NET MVC 路由(一)

    ASP.NET MVC路由(一) 前言 从这一章开始,我们即将进入MVC的世界,在学习MVC的过程中在网上搜索了一下,资料还是蛮多的,只不过对于我这样的初学者来看还是有点难度,自己就想看到有一篇引导性 ...

  2. ASP.NET MVC 路由(二)

     ASP.NET MVC路由(二) 前言 在上一篇中,提及了Route.RouteCollection对象的一些信息,以及它们的结构所对应的关系.按照处理流程走下来还有遗留的疑问没有解决这个篇幅就来讲 ...

  3. ASP.NET MVC 路由(三)

    ASP.NET MVC路由(三) 前言 通过前两篇的学习会对路由系统会有一个初步的了解,并且对路由系统中的Url规则有个简单的了解,在大家的脑海中也有个印象了,那么路由系统在ASP.NETMVC中所处 ...

  4. ASP.NET MVC 路由(四)

    ASP.NET MVC路由(四) 前言 在前面的篇幅中我们讲解路由系统在MVC中的运行过程以及粗略的原理,想必看过前面篇幅的朋友应该对路由有个概念性的了解了,本篇来讲解区域,在读完本篇后不会肯定的让你 ...

  5. ASP.NET MVC 路由(五)

    ASP.NET MVC 路由(五) 前言 前面的篇幅讲解了MVC中的路由系统,只是大概的一个实现流程,让大家更清晰路由系统在MVC中所做的以及所在的位置,通过模糊的概念描述.思维导图没法让您看到路由的 ...

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

    引子 在了解MVC路由之前,必须了解的概念是"片段".片段是指除主机名和查询字符串以外的.以"/"分隔的各个部分.比如,在http://site.com/Hom ...

  7. Asp.Net MVC 路由 - Asp.Net 编程 - 张子阳

    http://cache.baiducontent.com/c?m=9d78d513d98316fa03acd2294d01d6165909c7256b96c4523f8a9c12d522195646 ...

  8. ASP.NET MVC 路由进阶(之二)--自定义路由约束

    3.自定义路由约束 什么叫自定义路由约束呢?假如路由格式为archive/{year}/{month}/{day},其中year,month,day是有约束条件的,必须是数字,而且有一定范围. 这时候 ...

  9. 自定义MVC路由配置

    首先我用MVC4新增一个订单查看的功能 1.创建控制器OrderController namespace MvcApplication3.Controllers { public class Orde ...

  10. AngularJS html5Mode与ASP.NET MVC路由

    AngularJS html5Mode与ASP.NET MVC路由共存 前言 很久之前便听说AngularJS,非常酷,最近也比较火,我也在持续关注这个技术,只是没有认真投入学习.前不久公司找我们部门 ...

随机推荐

  1. Grunt-几个常用的任务配置,加载,执行的写法

    http://www.gruntjs.net/sample-gruntfile Gruntfile 实例 下面就针对一个 Gruntfile 案例做简单分析,也可以作为一个实例使用: module.e ...

  2. mysql 子查询优化

    今天用到要查询七天内都没有装机的门店信息,首先想到了用not in,先把装机的userid查出来,然后再id not in,但是这样就必须使用子查询,数据量少还可以,数据量大了的话,肯定效率特别低,因 ...

  3. QT第一天学习

    sudo apt-get install libqt4-dev回顾: 面向对象方法: 封装.继承.多态 封装:类 数据和操作 实现了信息隐藏 public: 类的内部 类的外部 private: pr ...

  4. --@angularJS--浅谈class与Ng-Class的应用

    1.angularjs的表达式是可以写在class里面动态改变其值的,写法如下: □.CSS1.html: <!doctype html><html ng-app="MyC ...

  5. Java线程:线程状态

    线程可以创建6状态: New()新创建.Runnable(可运行).Blocked(被阻塞). Waiting(等待).Timed waiting(计时等待).Terminated(被终止)1 新建线 ...

  6. 采用FirePHP调试PHP程序

    采用FirePHP调试PHP程序 FirePHP是什么? FirePHP是一个利用Firebug console栏输出调试信息方便程序调试.这一切只需要调用几个简单的函数. 他看起来是怎么个样子? 1 ...

  7. windows环境下使用git客户端、github和tortoisegit管理项目代码

    一.为什么 为什么不用svn? svn是一个优秀的代码和版本管理工具,使用svn只需要搭建好svn中央仓库,配置本地svn客户端即可,自从google code关闭服务之后,互联网上已经没有非常好的公 ...

  8. 使用Typescript来写javascript

    使用Typescript来写javascript 前几天尝试使用haxejs来写javascript,以获得静态类型带来的益处.虽然成功了,但很快发现将它与angularjs一起使用,有一些不太顺畅的 ...

  9. C++ Primer 笔记 第一章

    C++ Primer 学习笔记 第一章 快速入门 1.1 main函数 系统通过调用main函数来执行程序,并通过main函数的返回值确定程序是否成功执行完毕.通常返回0值表明程序成功执行完毕: ma ...

  10. 编写JQuery插件-1

    看到这篇文章的人相信大家都学会了jq,或者正在用jq,在这里简单介绍一下jq的插件封装: jQuery的插件主要分为3种类型: 1.封装对象方法的插件 这种插件是将对象的方法封装起来,用于对通过选择器 ...