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 />...................");

时间: 2024-08-30 11:48:39

asp.net中的路由系统的相关文章

ASP.NET Web API路由系统:路由系统的几个核心类型

虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除了对System.Web.dll程序集的依赖,实现在ASP.NET Web API框架中的URL路由系统亦是如此.也就是说,ASP.NET Web API核心框架的URL路由系统与ASP.NET本身的路由系统是相对独立的.但是当我们采用基于Web Host的方式(定义在程序集System.Web.H

[学习笔记] 理解ASP.NET MVC的路由系统

引言 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请求URL最终被传递给特定Controller的特定Action进行处理.而在相反的方向上,MVC框架的渲染器同样要利用这张路由表,生成最终的HTML页面并返回URL.所以,理解整个ASP.NET MVC的路由系统,有两个必须出现的关键元素:Controller与Action,有两个方向的操作:传入的

第六篇 Flask中的路由系统

Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST"]) 为什么要这么用?其中的工作原理我们知道多少? 一.@app.route() 装饰器中的参数 methods :当前 url 地址,允许访问的请求方式 @app.route("/info", methods=["GET", "POST"]) d

Flask中的路由系统

Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST"]) 至于为什么这么使用,马上开始介绍 [email protected]() 装饰器中的参数 (1).methods: 当前url地址,允许访问的请求方式,默认支持"GET", 如果想加入新的请求方式,就必须加上"GET" USER = {"usernam

MVC3中的路由系统(Routes)

转载:http://blog.csdn.net/francislaw/article/details/7429317 MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control里对应的ActionMethod,由ActionMethod 来决定返回用户什么样的信息.而把用户访问的地址对应到对应的Action(当然也可以是对应的文件)的工作有路由系统完成,这其中许多复杂的处理 由.net自动完成,而开发者需要告诉.net用户的访问地址和对应Action的具体映射关系. MV

WebApi学习总结系列第四篇(路由系统)

由于工作的原因,断断续续终于看完了<ASP.NET Web API 2 框架揭秘>第二章关于WebApi的路由系统的知识. 路由系统是请求消息进入Asp.net WebApi的第一道屏障,其根本目的利用注册的路由表对请求的URI进行解析以确定目标HttpController和Action的名称,以及与某个Action方法某个参数进行绑定的路由变量. Asp.net webApi中的路由系统和Asp.net中的路由系统很相似,也有Route,只是WebApi的路由系统又独立于Asp.net的路由

探索ASP.NET MVC路由系统

引言 对于ASP.NET MVC的路由系统相信大家肯定不陌生.今天我们就深入ASP.NET的框架内部来看一下路由系统到底是怎么通过我们给出的地址(例如:/Home/Index)解析出Controller和Action.今天的这一篇文章我们就深入框架内部,看看里面的流程. UrlRouteModule介绍 ASP.NET MVC本质上是通过IHttpModule和IHttpHandler两个组件对ASP.NET框架进行扩展来实现的.ASP.NET 请求处理过程是基于管道模型的,这个管道模型是由多个

.NET/ASP.NET Routing路由(深入解析路由系统架构原理)

出处:http://www.cnblogs.com/wangiqngpei557/ 阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4.1UrlRoutingModule 对象内部结构 4.2RouteBase.Route.RouteCollection.RouteTable 路由核心对象模型 4.3RouteValueDictionary.Rou

【转】.NET/ASP.NET Routing路由(深入解析路由系统架构原理)

阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4.1]UrlRoutingModule 对象内部结构 4.2]RouteBase.Route.RouteCollection.RouteTable 路由核心对象模型 4.3]RouteValueDictionary.RouteData.RequestContext 路由数据对象模型 4.4]IRou