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中的路由系统的更多相关文章

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

    虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...

  2. ASP.NET Web API路由系统:Web Host下的URL路由

    ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...

  3. 理解ASP.NET MVC的路由系统

    引言 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请 ...

  4. Django中的路由系统:urls

    Django的路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是以这种方式告诉Django,对于这个URL调用 ...

  5. django 中的路由系统(url)

    路由系统 根据Django约定,一个WSGI应用里最核心的部件有两个:路由表和视图.Django框架 的核心功能就是路由:根据HTTP请求中的URL,查找路由表,将HTTP请求分发到 不同的视图去处理 ...

  6. 第六篇 Flask中的路由系统

    Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...

  7. ASP.NET MVC3中的路由系统 Routes

    MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control里对应的ActionMethod,由ActionMethod来决定返回用户什么样的信息.而把用户访问的地址对应到对应的 ...

  8. ASP.NET MVC3中的路由系统(Routes) .

    MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control里对应的ActionMethod,由ActionMethod来决定返回用户什么样的信息.而把用户访问的地址对应到对应的 ...

  9. ASP.NET MVC3中的路由系统

    MVC中,用户访问的地址并不映射到服务器中对应的文件,而是映射到对应Control里对应的ActionMethod,由ActionMethod来决定返回用户什么样的信息.而把用户访问的地址对应到对应的 ...

随机推荐

  1. POJ 3311 Hie with the Pie floyd+状压DP

    链接:http://poj.org/problem?id=3311 题意:有N个地点和一个出发点(N<=10),给出全部地点两两之间的距离,问从出发点出发,走遍全部地点再回到出发点的最短距离是多 ...

  2. 日期格式化{0:yyyy-MM-dd HH:mm:ss.fff}和{0:yyyy-MM-dd hh:mm:ss.fff}的区别

    原文:日期格式化{0:yyyy-MM-dd HH:mm:ss.fff}和{0:yyyy-MM-dd hh:mm:ss.fff}的区别 {0:yyyy-MM-dd HH:mm:ss.fff}:使用24小 ...

  3. Post和Get差异

    GET和POST差别例如以下: 1,生成方式 get方式有四种:1)直接在URL地址栏中输入URL.2)网页中的超链接.3)form中method为get. 4)form中method为空时.默认是g ...

  4. Oracle 11g sys,system 密码忘记设置解决办法

    原文:Oracle 11g sys,system 密码忘记设置解决办法 1.启动sqlplus 2.请输入用户名:  sqlplus/as sysdba 3.输入口令: 直接回车 4.连接到: Ora ...

  5. APP-随身听

    简单到复杂听你的专属音响界,听金融.听物业,听新闻和其他节目专辑,简要介绍了新的音频应用,给你不一样的聆听体验.还记得老歌做?这里有.您留声机的一部分!很简单的音频应用,随时随地与此应用程序来听你的私 ...

  6. (64位oracle使用32位的PLSQL)安装64位的oracle数据库软件,使用32位的PLSQL Developer连接方法

    因为PLSQL Developer没有提供64位的,于是依据网上的资料做了一下整理,发上来 1.下载并安装Oracle 11g R2 64位,在server上安装时忽略硬件检測失败信息: 2.下载Or ...

  7. SQL点滴2—重温sql语句中的join操作

    原文:SQL点滴2-重温sql语句中的join操作 1.join语句 Sql join语句用来合并两个或多个表中的记录.ANSI标准SQL语句中有四种JOIN:INNER,OUTER,LEFTER,R ...

  8. SVG 学习(一)

    SVG 意为可缩放矢量图形(Scalable Vector Graphics). SVG 使用 XML 格式定义图像. 什么是SVG? SVG 指可伸缩矢量图形 (Scalable Vector Gr ...

  9. Javascript多线程引擎(五)

    Javascript多线程引擎(五)之异常处理 C语言没有提供一个像Java一样的异常处理机制, 这就带来了一个问题, 对于一个子函数中发生异常后, 需要在父函数调用子函数的位置进行Check, 如果 ...

  10. vs2012快速将项目托管到github

    vs2012快速将项目托管到github   在VS2012中使用GitHub 注册GitHub账号(DeanZhouLin) https://github.com/ 向GitHub中添加一个仓库(T ...