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方法就行了 ...
一周排行
  • 李静颖2年前,一篇名为<中国VC界三大"高帅富">的文章在网上的点击率很高,CA(CyberAgent)创投董事总经理戴周颖就是在文章中被点到名的一位."我觉得自己一点都不高 ...
  • 今天看到51CTO正在搞Linux Shell 脚本大赛,特地将自己的处女作发出来,希望能够得到分享. 这里说一下这个脚本的功能,这个脚本主要用来实现VSFTPD服务器的基础管理,主要用于方便运维管理.代码不是很美, ...
  • 实现效果需要处理以下这三个消息: WM_NCHITTEST WM_SETCURSOR WM_NCLBUTTONDOWN 消息处理函数:   UINT CXXXDlg::OnNcHitTest(UINT nHitTes ...
  • 用compass快速给你的网站添加搜索功能 如果你的网站架构采用的是spring+hibernate.用现在比较流行的开源搜索引擎框架compass可以快速的给你的网站添加强大的搜索功能.从几十万条数据中,只需几毫秒 ...
  • 在用JSP制作的电子商务网站多如牛毛.但是对于JSP网站而言,安全性真的能够让人放心吗?面对层出不穷的黑客攻击和病毒袭击,JSP网站的服务器能够比其他网站的服务器器更加安全吗?前段时间,应朋友之邀,我对他们托管的三台 ...
  • Android SD卡路径问题 在研究拍照后突破的存储路径的问题,开始存储路径写死为: private String folder = "/sdcard/DCIM/Camera/"(SD卡上拍照程 ...
  • 以前一直在做卡乐付,悲剧的是项目中的余额查询,超级转账和刷卡器相关的东西已经开发好了,我对这块还是比较好奇和感兴趣的,在项目空闲的时候我就开始尝试熟悉和了解这块的业务和代码.实践出真理,只有在实践中才能发现问题.真想 ...
  • 2007年05月30日 星期三 2 证券交易费用 股票交易费用表 基金.债券和权证交易费用表 交易所其他费用 无 股票买进加卖出都要收手续费.买进加卖出佣金各为0.3%, 上海小于或等于3‰ 起点:5元深圳小 ...
  • 在模板定义语法中关键字class与typename的作用完全一样. 什么是类模板  如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板 类模板定义 Step ...