博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET的路由系统:根据路由规则生成URL
阅读量:4586 次
发布时间:2019-06-09

本文共 3485 字,大约阅读时间需要 11 分钟。

前面我们已经提到过,ASP.NET 的路由系统主要具有两个方面的应用,其一就是通过注册URL模板与物理文件路径的匹配实现请求地址和物理地址的分离;另一个则是通过注册的路由规测生成一个相应的URL。后者通过调用RouteCollection类型的GetVirtualPath方法来实现。[源代码从下载]

如下面的代码片断所示,GetVirtualPath定义了两个GetVirtualPath方法重载,它们共同的参数requestContext和values分别表示请求上下文(RouteData和HTTP上下文的封装)和用于替换定义在URL模板中的变量站位符的值。另一个GetVirtualPath方法具有一个额外的字符串参数name,它表示集合中具体使用的路由对象的注册名称(调用MapPageRoute方法时指定的第一个参数)。而AppendTrailingSlash和LowercaseUrls决定在对生成的URL进行规范化的时候是否添加一个“/”字符(如果没有),以及是否需要将URL转化为小写。

1: public class RouteCollection : Collection
2: {
3:     //其他成员
4:     public VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values);
5:     public VirtualPathData GetVirtualPath(RequestContext requestContext, string name, RouteValueDictionary values);
6:
7:     public bool AppendTrailingSlash {  get;  set; }
8:     public bool LowercaseUrls {  get;  set; }
9: }

如果调用GetVirtualPath方法时没有指定具体采用的路由对象,会遍历整个集合的每个路由对象并调用其GetVirtualPath方法,如果返回的VirtualPathData不会Null则直接将其作为返回值;否则(找不到匹配的路由对象)返回Null。如果在调用GetVirtualPath确定了具体使用的路由对象,则直接调用该路由对象的GetVirtualPath方法并返回其执行结果。

我们在调用GetVirtualPath方法的时候可以传入Null作为第一个参数(requestContext),在这种情况下会基于当前HTTP上下文(对应于HttpContext的静态属性Current)创建一个RequestContext对象作为调用路由对象GetVirtualPath方法的同名参数,该参数包含一个空的RouteData对象。如果当前HTTP上下文不存在则直接抛出一个InvalidOperationException异常。

路由对象针对GetVirtualPath方法而进行的路由匹配只要求URL模板中定义的变量的值都能被提供,而这些变量值具有三种来源,分别是路由对象定义的默认变量值指定RequestContext的RouteData提供的变量值(Values属性)手工提供的变量值(通过values参数指定的RouteValueDictionary对象),这三种变量值的选择优先级由低到高。同样以之前定义关于获取天气信息的URL模板为例,下面是路由注册代码。

1: public class Global : System.Web.HttpApplication
2: {
3:     protected void Application_Start(object sender, EventArgs e)
4:     {
5:         var defaults = new RouteValueDictionary { { "areacode", "010" }, { "days", 2 }};
6:         var constaints = new RouteValueDictionary { { "areacode", @"0\d{2,3}" }, { "days", @"[1-3]{1}" } };
7:         var dataTokens = new RouteValueDictionary { { "defaultCity", "BeiJing" }, { "defaultDays", 2 } };
8:         RouteTable.Routes.MapPageRoute("default", "{areacode}/{days}", "~/weather.aspx", false, defaults, constaints, dataTokens);
9:     }
10: }

我们在Weather.aspx页面的后台代码中通过如果如下的代码调用RouteTable和Routes熟悉的GetVirtualPath方法生成三个具体的URL。

1: public partial class Weather : Page
2: {
3:     protected void Page_Load(object sender, EventArgs e)
4:     {
5:         RouteData routeData = new RouteData();
6:         routeData.Values.Add("areaCode","0512");
7:         routeData.Values.Add("days","1");
8:         RequestContext requestContext = new RequestContext();
9:         requestContext.HttpContext = new HttpContextWrapper(HttpContext.Current);
10:         requestContext.RouteData = routeData;
11: 
12:         RouteValueDictionary values = new RouteValueDictionary();
13:         values.Add("areaCode", "028");
14:         values.Add("days", "3");
15: 
16:         Response.Write(RouteTable.Routes.GetVirtualPath(null,null).VirtualPath + "
");
17:         Response.Write(RouteTable.Routes.GetVirtualPath(requestContext, null).VirtualPath + "
");
18:         Response.Write(RouteTable.Routes.GetVirtualPath(requestContext, values).VirtualPath + "
");
19:     }
20: }

从上面的代码片断我们可以看到:第一次调用GetVirtualPath方法传输的requestContext和values参数均为Null;第二次则指定了一个手工创建的RequestContext对象,其RouteData的Values属性具有两个变量(areaCode=0512;days=1),而values参数依然为Null;第三次我们同时为参数requestContext和values指定了具体的对象,而后者包含两个参数(areaCode=028;days=3)。在浏览器上访问Weather.aspx页面会得到如下图所示的3个URL。这充分证实了上面提到的关于变量选择优先级的结论。

转载于:https://www.cnblogs.com/artech/archive/2012/03/21/aspnet-routing-03.html

你可能感兴趣的文章
学习spring cloud 笔记
查看>>
字符串截取,SubString
查看>>
Android: 网络随时需要在3G和Wifi切换,网络程序需要注意
查看>>
ajax调用servlet
查看>>
IText 生成横向的doc文档
查看>>
认识了个外国友人!
查看>>
对Cookie进行增删改查
查看>>
MySQL sql语句获取当前日期|时间|时间戳
查看>>
微信支付官方SDK V3 .NET版的坑
查看>>
Python(一)list tuple dict set
查看>>
什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁
查看>>
hdu4651(广义五边形数 & 分割函数1)
查看>>
python iter,迭代器&dict,字典详解
查看>>
python笔记1
查看>>
C语言:自定义一个查找字串的功能函数,类似于<string.h>中的strstr()
查看>>
数据库联系 创建表格:重点
查看>>
Regist
查看>>
设置磁盘配额(第二版)
查看>>
C++ 获取字符串中的所有汉字
查看>>
js 滚动到指定位置(带step 速度)
查看>>