asp.net中的路由系统
ASP.NET MVC重写了ASP.NET管道HttpModule和处理程序HttpHandler。MVC自定义了MvcHandler实现了Controller的激活和Action的执行。但是在请求到达这里之前把Http请求Url解析到正确的Controller和Action上,是通过自定义HttpModule来实现的,这个自定义的HttpModule就是Url路由系统UrlRoutingModule。
1:UrlRoutingModule拦截请求的Url,对Url进行解析,得到以Controller和Action为核心的路由数据。
2:UrlRoutingModule的好处:
1:灵活性,Url无需对应磁盘上的物理文件
2:可读性,可以设置自定义的Url规则。
3:SEO优化,对Url进行有效的优化,更容易被搜索收录。
在以前IIS有一个Url重写模块,Url被IIS处理之前,根据其规则,重定向到物理文件。这个重写是IIS级别的。而MVC路由系统,它是ASP.NET的一部分,是通过托管代码实现的。
3:Page类有一个公开的属性Page. RouteData,System.Web.Routing.RouteData表示通过路由系统对当前请求进行解析得到的路由数据。RouteData.Values属性表示存储路由变量的字典,可以从中取出路由变量的值。
var defaults = new RouteValueDictionary{ { "name", "*" }, { "id", "*" } };
RouteTable.Routes.MapPageRoute("", "employees/{name}/{id}", "~/EmployeePage.aspx", true, defaults);
上面注册路由变量name,id,在Page页面可以动过RouteData取出
string name = Page.RouteData.Values["name"].ToString()
string id = Page.RouteData.Values["id"].ToString()
4:Route和RouteTable
-->一个Web具有一个全局的路由表,该表是通过System.Web.Routing.RouteTable的静态只读字段Routes表示
-->System.Web.Routing.RouteTable.Routes返回一个System.Routing.RouteCollection的集合。表示整个Web的全局路由表。
-->调用RouteCollection的MapPageRoute方法,将物理文件映射到一个URL模版上,这个过程是基于指定的URL模版创建一个路由对象并添加到全局路由表中。
-->System.Web.Routing.Route是抽象类RouteBase唯一的直接子类,基于模版创建的路由匹配规则就定义在Route中。
-->Route匹配请求的地址是否与Url模版匹配?首先将Url通过分隔符/进行拆分,拆分成多个段,每个段又分为变量和文本。变量有{}包围,文本是单纯的文本。检查文本的内容是否一致,以及变量的数量是否一致。
-->Route属性Constraints为定义在Url模版中的变量以正则表达式的形式座一些限定。属性Constraints类型为RouteValueDictionary,Key和Value分别表示变量名和限定的表达式。定义了Constraints,除了验证Url模版的段,还需通过正则表达式的验证。
-->Route属性Default为变量定义了默认值。Default类型为RouteValueDictionary
-->Route属性DataTokens通过路由传递到处理程序,未使用的值。DataTokens的类型为RouteValueDictionary。
-->RouteTable.Routes.RouteExistingFiles,表示是否对已存在的物理文件使用路由。
-->通量匹配,可以采用通量匹配来匹配Url最后的部分,可以包含多个段。{*变量}
RouteTable.Routes.MapPageRoute("", "employees/{name}/{*id}", "~/EmployeePage.aspx", true, defaults);
/employees/李四/002/1212
那么变量id,能够匹配到002/1212
-->System.Web.Routing.RouteTable.Routes,通常有两个方法来注册路由
System.Web.Routing.RouteTable.Routes.MapPageRoute() 注册物理文件与Url模版之间的映射,也就是给System.Web.Routing.RouteCollection集合添加一个Route对象
System.Web.Routing.RouteTable.Routes.Ignore() 注册让路由系统忽略的Url模版。
5:使用System.Web.Routing.RouteTable.Routes.MapPageRoute()注册物理文件与Url模版之间的映射。
//对已存在的物理文件也使用路由
RouteTable.Routes.RouteExistingFiles=true;
//Route对象的Default属性,指定路由变量的默认值。
var defaultW = new RouteValueDictionary { { "areacode", "010" }, { "days", 2 } };
//Route对象的Constraints属性,使用正则表达式约束路由变量。
var constraints = new RouteValueDictionary { { "areacode", @"0\d{2,3}" }, { "days", @"[1-3]{1}" } };
//Route对象的DataTokens属性,给处理程序传递值。
var dataTokens = new RouteValueDictionary { { "defaultCity", "Beijing" }, { "defaultDays", 2 } };
RouteTable.Routes.MapPageRoute("Weather", "Weather/{areacode}/{days}", "~/Weather.aspx", false, defaultW, constaints, dataTokens);
6:使用System.Web.Routing.RouteTable.Routes.Ignore()忽略Url模版。Routes.Ignore()方法需要放在注册路由方法Routes.MapPageRoute()前面。否则不起作用。
启用了RouteTable.Routes.RouteExistingFiles=True,会对所有的请求都按照路由表进行解析。那么针对CSS文件,JavaScript文件也进行了解析。那么就要使用Routes.Ignore()忽略静态文件的脚本
//对已存在的物理文件也使用路由
RouteTable.Routes.RouteExistingFiles=true;
RouteTable.Routes.Ignore("{filename}.css/{*pathInfo}");
7:使用System.Web.Routing.RouteTable.Routes.add(new Route())将路由添加到全局路由表中。它的作用和System.Routing.RouteTable.Routes.MapPageRoute()是一样的
//创建Route对象
Route route = new Route("{areacode}/{days}",
new RouteValueDictionary { { "areacode", "010" }, { "days", 2 } },
new RouteValueDictionary { { "areacode", @"0\d{2,3}" }, { "days", @"[1-3]{1}" }, { "httpMethod", new HttpMethodConstraint("GET") } },
new PageRouteHandler("~/Weather.aspx", true));
//将Route对象添加到全局路由表中
RouteTable.Routes.Add(route);
8:根据注册的路由规则生成相应的Url,使用RouteTable.Routes.GetVirtualPath(RequestContext,RouteValueDirectionary).ViretualPath;
RouteData r = new RouteData();
r.Values.Add("area","024");
r.Values.Add("days", 2);
Response.Write(RouteTable.Routes.GetVirtualPath(null,null).VirtualPath);
Response.Write("<br />...................");
RequestContext requestContext = new RequestContext();
requestContext.HttpContext = new HttpContextWrapper(HttpContext.Current);
requestContext.RouteData = r;
RouteValueDictionary values = new RouteValueDictionary { { "area", "011" }, { "days", 2 } };
Response.Write(RouteTable.Routes.GetVirtualPath(requestContext, null).VirtualPath);
Response.Write("<br />...................");
Response.Write(RouteTable.Routes.GetVirtualPath(requestContext, values).VirtualPath);
Response.Write("<br />...................");
asp.net中的路由系统的更多相关文章
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
- ASP.NET Web API路由系统:Web Host下的URL路由
ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...
- 理解ASP.NET MVC的路由系统
引言 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请 ...
- Django中的路由系统:urls
Django的路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是以这种方式告诉Django,对于这个URL调用 ...
- django 中的路由系统(url)
路由系统 根据Django约定,一个WSGI应用里最核心的部件有两个:路由表和视图.Django框架 的核心功能就是路由:根据HTTP请求中的URL,查找路由表,将HTTP请求分发到 不同的视图去处理 ...
- 第六篇 Flask中的路由系统
Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...
- ASP.NET MVC3中的路由系统 Routes
MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control里对应的ActionMethod,由ActionMethod来决定返回用户什么样的信息.而把用户访问的地址对应到对应的 ...
- ASP.NET MVC3中的路由系统(Routes) .
MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control里对应的ActionMethod,由ActionMethod来决定返回用户什么样的信息.而把用户访问的地址对应到对应的 ...
- ASP.NET MVC3中的路由系统
MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control里对应的ActionMethod,由ActionMethod来决定返回用户什么样的信息.而把用户访问的地址对应到对应的 ...
随机推荐
- Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION
原文:Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION Installshield获取安装包版本的系统变量为IFX_PRODUCT_VERSION 当笔记记下 ...
- linux内核的冒险md来源释义# 14raid5非条块读
linux内核的冒险md来源释义# 14raid5非条块读 转载请注明出处:http://blog.csdn.net/liumangxiong 假设是非条块内读.那么就至少涉及到两个条块的读,这就须要 ...
- C# 编译器选项 /platform(指定输出平台)32位程序运行到x64平台的问题
如果说你编译的exe运行时报错: “尝试读取或写入受保护的内存.这通常指示其他内存已损坏” 这很有可能是你是以非托管的方式错误地引用了64位的API中去. 为什么会这样? 那你就要考虑VS的编译器选项 ...
- Windows下Oracle不显示中文[已解决]
跟着视频学习,然后讲到插入的时候有中文性别,就GG了,该显示中文的时候都是问号,觉得应该是编码的问题. 于是上网找了下,测试可行,方法如下 1,查询Oracle编码的语句: [sql] SELECT ...
- 负载均衡DNS和反向代理优缺点
负载均衡 (Load Balancing) 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 负载均衡(又 ...
- 生活小助手--Android项目
每次想做一个Android项目都不知道要怎么开始,所谓前期工作,都是辅助于项目能顺利完成而做的. 每一个项目开始都要有几首准备: 第一,项目要做什么? 第二,项目中有那些版块? 项目的概要设计 项目流 ...
- C# 语言的多线程编程,完全是本科OS里的知识
基本知识,无参数Thread和带参数的Thread Thread类的参数就是参数指针,可以传入一个无参的函数. 如果要传入带参数的函数,先new一个ParameterizedThreadStart委托 ...
- Wookmark-jQuery-master 瀑布流插件
Wookmark-jQuery-master 瀑布流插件使用介绍,含个人测试DEMO 要求 必备知识 本文要求基本了解 Html/CSS, JavaScript/JQuery. 开发环境 Dream ...
- Android 5.0自定义动画
材料设计中的动画对用户的操作给予了反馈,并且在与应用交互时提供了持续的可见性.材料主题提供了一些按钮动画和活动过渡,Android 5.0允许你自定义动画并且可以创建新的动画: Touch Feedb ...
- 【欧拉计划4】Largest palindrome product
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1371281760.html 原创:[欧 ...