asp.net 路由学习一

从今天开始打算好好学习《ASP.NET MVC5 框架揭秘》这本书,希望让水平来一个质的提高,当然学习笔记还是要写的。
 
asp.net路由:IIS为我们提供里重写url机制,但是这在iis级别上解决了url与物理地址的分离,它的实现依赖于一个注册到IIS管道上的本地代码模块,而asp.net路由则是asp.net机制的一部分,并且是通过托管代码写的。那么到底asp.net机制是什么?首先理解一些常用类和对象。
 
   1.RouteBase类。
 
      路由系统的核心是Route对象,每一个路由注册(不同的url模式)对应的就是一个Route对象,这些Route对象注册到同一个Web应用中构成一个路由表。Route对象存储在RouteTable类里的静态属性Routes表示,这个属性返回一个RouteCollection对象。这里Route泛指继承自抽象类RouteBase的某个类型的对象
 
 
public abstract class RouteBase
        {
            //实现在GetRouteData方法中的路由解析是为了获取路由数据
            public abstract RouteData GetRouteData(HttpContextBase httpContext);
            //GetVirtualPath方法则通过路由解析生成一个完整的虚拟路径
            public abstract VirtualPathData GetVirtualPath(
                RequestContext requestContext,RouteValueDictionary values);
            //它表示是否对现有的物理文件实施路由,默认值为true,即不能通过url访问现有物理文件,只能通过路由注册表。
            public bool RouteExistingFiles { get; set; }
        }

 

 
       GetRouteData返回了一个RouteData对象,它用于封装路由数据。RouteData具有一个RouteBase的属性Route,该属性返回生成此RouteData的Route对象。其中还有
 
DataTokens和Values两个属性,这两个属性都返回RouteValueDictionary对象。RouteValueDictionary是一个实现了IDictionary<string,objects>接口的字典,用来保存路由变量。存储于Values和DataTokens的差别是:Values是解析请求url得到的;DataTokens是直接附加到路由对象上的自定义变量。RouteData类里还有一个非常重要的属性:RouteHandler,它在整个路由系统中具有重要的地位,因为最终用于处理请求的HttpHandler对象由它来提供
 
       GetVirtualPath返回了一个VirtualPathData对象。此方法被执行时,如果定义的路由模板中的变量与指定变量列表相匹配,它会使用指定的路由变量值去替换模板里的占位符,这样就得到了虚拟路径。生成的虚拟路径与Route对象最终被封装成一个VirtualPathData对象作为返回值。这个方法里还有一个参数,类型为RequestContext。
 
 
   public class RequestContext
    {
        //初始化 System.Web.Routing.RequestContext 类的新实例。
        public RequestContext();

        //httpContext:一个对象,该对象包含有关 HTTP 请求的信息
        //routeData: 一个对象,该对象包含有关与当前请求匹配的路由的信息
        public RequestContext(HttpContextBase httpContext, RouteData routeData);

        // 摘要:  获取有关 HTTP 请求的信息。
        // 返回结果: 一个对象,该对象包含有关 HTTP 请求的信息。
        public virtual HttpContextBase HttpContext { get; set; }

        // 摘要: 获取有关所请求路由的信息。
        // 返回结果: 一个对象,该对象包含有关所请求路由的信息。
        public virtual RouteData RouteData { get; set; }

 

 
 
2.Route类
 
   RouteBase是一个抽象类,在ASP.NET路由系统的应用编程接口中,Route类型是其唯一的直接继承者。这个类里面有一个Url属性,它代表绑定在该路由对象上的路由模板。当请求过来时,就根据Route对象里的Url属性与请求的url匹配,这就是路由解析。
 
    Route类型除了核心属性Url外,还有一些其他属性。Constraints为模板中的的变量设置一些约束条件,该属性类型为RouteValueDictionary,其key和Value分别为变量名和作为约束的正则表达式;Defaults同样也返回一个RouteValueDictionary对象,它保存了为路由变量定义的默认值。Route类型的DataTokens用于存储一些额外的路由变量,这些路由变量不会参与针对请求的路由解析,但对于调用Route类型的GetRouteData和GetVirtualPath方法得到的对象里的DataTokens包含的路由变量都来源于此。
更多相关文章
  • 北京商报讯(记者 蓝朝晖)虽然在国家政策的积极引导下,中国新能源汽车销售增长迅猛,但相对传统燃油汽车,续航里程短.充电难等问题依旧是阻碍新能源车广泛普及的短板.昨日,由北京市商务委员会.北京市科学技术委员会和北京市发展与改革委员会主办,北京商报社承办的北京新能源汽车发展论坛上,中国汽车工业协会副秘书 ...
  • 这两天仔细理解了一下Ajax,然后整理封装了一下,如果有什么不对的地方,请指教,谢谢! AJAX AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 是与服务 ...
  • Live Http headers是Firefox下Http头信息捕获利器,常用于安全测试.但不幸的是Replay功能无法在最近版本的Firefox浏览器(35.0.1)中工作,我决定在插件的官方版本更新之前做一个临时的修复. 我发现在HTTP Headers包含If-Modified-Since能 ...
  • KStoreProductViewController类是UIViewController的子类,.希望向用户展示App Store中产品时,需要: 1.实例化一个SKStoreProductViewController类2.设置它的delegate3.把sotre product视图控制器显示给消 ...
  • 关于远程js调用phonegap本地原生代码注意:       先在本地添加好插件,或者自己建立好插件后,把 cordova.js,cordova_plugin.js  和plugin文件下的js还有自己写的插件  xxxx.js放到服务器web目录下,然后在要引用的地方加入对应的<scrip ...
  • 从ExtJS 2.0到目前的4.0,Grid的列标题对齐方式都是和数据的对齐方式一致的,这不太符合中国人的习惯.解决办法是,自己重写一下Ext.grid.column.Column对象中渲染列标题的对齐方式的代码.代码只有一句,在afterRender方法中,因而重写afterRender方法就行了 ...
一周排行
  • 简介 Module模式是JavaScript编程中一个非常通用的模式,一般情况下,大家都知道基本用法,本文尝试着给大家更多该模式的高级使用方式. 首先我们来看看Module模式的基本特征: 1. 模块化,可重用 2. ...
  • winfrom是不能直接加载的动态图片的.只能够自己写方法实现. 具体代码如下: using System; using System.Collections.Generic; using System.Compon ...
  • 一个典型的例子就是卷管理软件.许多操作系统平台上都有一种甚至多种卷管理软件层,常见的有AIX平台上的Volume Group,Solaris平台上的Volume Manager,Linux平台上的LVM等.这些卷管理 ...
  • 易网科技讯 8月19日消息,凤凰卫视今日发布公告称,中国移动通信集团公司副总经理沙跃家将出任该公司非执行董事,同时中国移动总经理李跃辞任凤凰卫视非执行董事职务,自今日起生效. 中移动今日也发布公告称,李跃将出任中国移 ...
  •  动态链接库的创建:        首先要看看官方网站给出的详细介绍如何  创建和使用dll动态链接库项目 这个链接中将创建dll的项目和使用dll的项目放在同一个solution当中.这可能不是我们想要的情况.我们 ...
  • 晨报讯 14日,港澳资讯的客户都陆续收到了唐骏签发给他们的中秋致辞邮件和一份月饼.致辞中,唐骏隐性地对"学历门"事件作出回应:"2010年的夏天对我本人来说是个不平凡的夏天,有风有雨.& ...
  •        camera的坐标系是左手坐标系.伸出左手,让拇指和食指成L形,大拇指向右,食指向上,中指指向前方,这样我们就建立了一个左手坐标系,拇指,食指,中指的指向分别代表了x,y,z轴的正方向.如下图所示: 下 ...
  • volatile 变量volatile 是用来保证[内存同步]的关键字,内存同步是说在某个线程中修改某实例字段能够及时地更新到主存储区,而某线程如果需要引用该字段也能及时地从主存储区中得到最新的数据.简单说它是当前线 ...
  • Public adoConn As New ADODB.Connection Private Sub csv() adoConn.ConnectionString = "Driver={Microsoft ...
  • -- job属性 DECLARE @jobId BINARY(16); DECLARE @job_name NVARCHAR(128); DECLARE @enabled TINYINT; DECLARE @noti ...