一.概念

  1.路由是计算机网络中的一个技术概念,表示把数据包从一个网段转发至另一网段。ASP.NET中的路由系统作用类似,其作用是把请求Url映射到相应的"资源"上,资源可以是一段代码或具体的Web页面.路由系统提供了一种简单抽象机制,让我们利用Url更加精简方式表示资源,而无关资源具体的实现或表示。

  2. 路由系统包含一系列重要的概念,现介绍如下:

路由规则(RouteBase): 表示其中具体的一条路由条件,如果满足该路由条件,则转发至该路由处理. 路由规则由路由名称,路由默认值,Url路由模式,约束,附加数据这几部分组成

路由表(RouteCollection): 路由规则的集合

路由数据(RouteData): 表示路由匹配的结果,包含当前路由的数据

路由处理(IRouteHandler): 表示路由处理,返回一个IHttpHandler处理当前请求

  3.路由与Url重写的区别

    Url重写从设计目的来说是把一个Url映射到另一个Url, 功能比较单一,路由是把Url映射一个系统资源,另外,路由系统也支持生成Url, 通俗说支持双向"路由".

二.应用

  1. 为请求Url 检查路由匹配

    新建一个ASP.NET MVC4 Internet项目,在App_Start目录RouteConfig.cs 有如下代码:

   public static void RegisterRoutes(RouteCollection routes)

   {  

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
      name: "Default",
      url: "{controller}/{action}/{id}",
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
    }

   routes.IgnoreRoute 表示忽略特定的请求

   routes.MapRoute 表示为系统添加一条的规则,name表示路由名称是Default, url表示路由模式是{controller}/{action}/{id}, 括弧中表示一个"段",

   defaults表示路由默认值, 如果相应的段在请求Url中不存在但有默认值则取默认值 ,id 表示可选参数

   该条路由匹配以下url :

      http://localhost/              controller = "Home", action = "Index"

      http://localhost/Home          controller = "Home", action = "Index"

      http://localhost/Home/Get              controller = "Home", action = "Get"

      http://localhost/Home/Get/1           controller = "Home", action = "Get", id = "1"

   假设有下一个场景,要查询某一分类某年某月某天的报表,我们设计Url模式为/Category/year/month/dd,具体的如下代码

      routes.MapRoute(

        name: "Report",
        url: "{Category}/{year}/{month}/{dd}",
        defaults: new { controller = "Report", action = "Index", year = UrlParameter.Optional,
          month = UrlParameter.Optional, dd = UrlParameter.Optional},
        constraints: new { method = new HttpMethodConstraint("GET"), year = @"\d+"}
     );

     这条路由包含了约束条件, 约束条件可以是正则表达式或实现了IRouteConstraint接口的对象

  2. 根据路由上下文件数据生成Url

    UrlHelper.Action 和 HtmlHelper.ActonLink  分别根据controller/action生成Url和链接

    UrlHelper.RouteUrl 和HtmlHelper.RouteLink 根据特定路由生成Url和链接

    另外RouteCollection 两个静态属性影响生成Url

    LowercaseUrls  表示生成的Url是否小写形式

    AppendTrailingSlash 表示是否在生成的Url添加"/" 以标准化

三. 路由系统其它特性

  1. 是否对物理文件路由 RouteCollection.RouteExistingFiles ,默认情况下为false

  2. 忽略特定的请求模式  通过IgnoreRoute方法注册相应的模式,该路由一个特殊的处理类,叫做StopRoutingHandler 

  3. 路由调试  路由调试组件需要另外安装,打开包管理控制台,执行 Install-Package routedebugger命令。通过该组件你可以在页面看到详细的路由匹配情况,另外安装会在Web.config中添加一个配置项<add key="RouteDebugger:Enabled" value="true" />, 设为false禁用路由调试

四. 区域路由(Area)

  ASP.NET MVC提供了区域功能帮助更好的组织网站结构,每个区域都是完整的ASP.NET MVC系统

  在大型Web系统中,也许要特定的模块组织网站逻辑架构, 比如一个订单管理系统,可以分成Customer,Products, Orders 等几个区域分别开发

五. 路由扩展

  通过实现抽象类RouteBase, IRouteHandler和IHttpHandler接口,可以对路由系统进行扩展,比如如下该列子

  http://www.cnblogs.com/luanwey/archive/2009/08/12/1544444.html 实现二级域名

ASP.NET MVC4学习笔记路由系统概念与应用篇的更多相关文章

  1. ASP.NET MVC4学习笔记路由系统实现

    一.路由实现 路由系统实际是一个实现了ASP.NET IHttpModule接口的模块,通过注册HttpApplication的PostResolveRequestCache 事件对Url路由处理.总 ...

  2. asp.net mvc4 学习笔记一(基本原理)

    做了8年的asp.net webform,用过MVVM但还没用过MVC , 虽然项目不用MVC,但是还是想了解一下,今天第二天学习,以下是学习心得. VS2012默认带有asp.net mvc3和as ...

  3. ASP.NET MVC4学习笔记之Controller激活的扩展

    一. 为什么要进行扩展 在前面的分析中,我们知道默认的Controller激活系统只能实例化无参构造函数的Controller类型,但在某些情况一下,我们希望某些服务的实例能够自动注入到Control ...

  4. ASP.NET MVC4学习笔记之Controller的激活

    一. 高层相关类说明 当路由系统根据请求Url收集路由信息后,下一步就要将路由信息传给Controller激活系统,Controller激活系统负责实现了IController接口的Controlle ...

  5. ASP.NET MVC4学习笔记之总体概述

    断断续续使用ASP.NET MVC框架也有一年多了,也算积累了一些经验,唉,一直想写一些笔记好好总结一下,人太懒不想动笔,今天终于决定开始.希望自己能坚持下去. 这篇文章大体介绍ASP.NET MVC ...

  6. ASP.NET MVC4学习笔记

    一.MVC简介

  7. Asp.net core (学习笔记 路由和语言 route & language)

    https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1 https://doc ...

  8. 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换

    路由其实也可以很简单-------Asp.net WebAPI学习笔记(一)   MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...

  9. Symfony2 学习笔记之系统路由

    mfony2 学习笔记之系统路由   漂亮的URL绝对是一个严肃的web应用程序必须做到的,这种方式使index.php?article_id=57这类的丑陋URL被隐藏,由更受欢迎的像 /read/ ...

随机推荐

  1. Oracle基础 (十三)日期函数

    日期函数 SYSDATE --当前系统时间 select sysdate from dual; EXTRACT --获取当前年份 select extract(year from sysdate) f ...

  2. C#中Dictionary小记

    使用C#中Dictionary的一下细节小记: 一.Dictionary.Add(key,value) 与 Dictionary[key]=value的区别: 如果Dictionary中已经有了key ...

  3. python 基础——运算符重载

    方法 重载 调用 __init__ 构造函数 x = Class() __del__ 析构函数 del x __str__ 打印 print x __call__ 调用函数 x(*args) __ge ...

  4. angularJs中图表功能(有集成框架)-angular-flot

    1.柱状图和折线图的数据格式: $scope.Chart.data = [ { label: "离线", data: [[0, 2]] }, { label: "在线&q ...

  5. 第四节 数据格式化和ModelAttribute注解的介绍

    从来都不坦荡,情绪都写在脸上:不开心的时候,不爱说话,笑也勉强. 课堂笔记,如果这么写,不仅仅是手速,还要有语速, 这样不太适合! --胖先生 关于数据传递: 客户端传递数据到服务端: 1.使用普通的 ...

  6. 理论制作 Windows 开机动画

    第一次接触 Windows 开机动画是 2012 年,那时候魔方的版本号还是 3.12,魔方里面有个很酷炫狂霸拽的功能就是替换 Windows 7 的开机动画.一开始我是在IT之家论坛里下载开机动画, ...

  7. css隐藏元素display:none,opacity:0;filter:alpha(opacity=0-100;,visibility:hidden的区别

    在CSS中,让元素隐藏(指屏幕范围内肉眼不可见)的方法很多,有的占据空间,有的不占据空间:有的可以响应点击,有的不能响应点击.我们一般有三种方式:display:none, opacity:0;fil ...

  8. C#中ToString和Formate格式大全

    C#中ToString格式大全 stringstr1 =); //result: 56,789.0 stringstr2 =); //result: 56,789.00 stringstr3 =); ...

  9. php 图片调整大小 封装类【转载】

    <?php class ImageResize { private $image; private $img_des; private $image_type; private $permiss ...

  10. Sql中判断"库、表、列,视图,存储过程"是否存在

    --判断数据库是否存在 IF EXISTS (SELECT * FROM MASTER.sys.sysdatabases WHERE NAME = '库名') PRINT 'exists ' else ...