前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >ASP.NET的路由系统:根据路由规则生成URL

ASP.NET的路由系统:根据路由规则生成URL

作者头像
蒋金楠
发布于 2018-01-15 07:02:09
发布于 2018-01-15 07:02:09
1.4K0
举报
文章被收录于专栏:大内老A大内老A

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

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

代码语言:js
AI代码解释
复制
   1: public class RouteCollection : Collection<RouteBase>
   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模板为例,下面是路由注册代码。

代码语言:js
AI代码解释
复制
   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。

代码语言:js
AI代码解释
复制
   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 + "<br/>");
  17:         Response.Write(RouteTable.Routes.GetVirtualPath(requestContext, null).VirtualPath + "<br/>");
  18:         Response.Write(RouteTable.Routes.GetVirtualPath(requestContext, values).VirtualPath + "<br/>");
  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。这充分证实了上面提到的关于变量选择优先级的结论。

ASP.NET的路由系统:URL与物理文件的分离 ASP.NET的路由系统:路由映射 ASP.NET的路由系统:根据路由规则生成URL

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-03-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET MVC路由扩展:路由映射
上周我写了三篇文章(一、二、三)详细地介绍了ASP.NET的路由系统。ASP.NET的路由系统旨在通过注册URL模板与物理文件之间的映射进而实现请求地址与文件路径之间的分离,但是对于ASP.NET MVC应用来说,请求的目标不再是一个具体的物理文件,而是定义在某个Controller类型中的Action方法。出于自身路由特点的需要,ASP.NET对ASP.NET的路由系统进行了相应的扩展。 目录 一、基本路由映射 二、实例演示:注册路由映射与查看路由信息 三、基于A
蒋金楠
2018/01/15
1.4K0
ASP.NET MVC路由扩展:路由映射
.NET/ASP.NET Routing路由(深入解析路由系统架构原理)
王清培
2018/01/08
1.6K0
.NET/ASP.NET Routing路由(深入解析路由系统架构原理)
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.Http.We
蒋金楠
2018/01/15
9.6K0
ASP.NET Web API路由系统:路由系统的几个核心类型
ASP.NET Core的路由[3]:Router的创建者——RouteBuilder
在《注册URL模式与HttpHandler的映射关系》演示的实例中,我们总是利用一个RouteBuilder对象来为RouterMiddleware中间件创建所需的Router对象,接下来我们就着重来介绍这个对象。RouteBuilder是我们对所有实现了IRouteBuilder接口的所有类型以及对应对象的统称。[本文已经同步到《ASP.NET Core框架揭秘》之中] 目录 一、RouteBuilder 二、RouteCollection 三、多个Route共享同一个Handler 四、每个Route
蒋金楠
2018/03/27
9330
ASP.NET Core的路由[3]:Router的创建者——RouteBuilder
精通MVC3摘译(3)-自定义路由系统
如果你不喜欢标准路由对象匹配URL的方式,或者你想实现一些特殊的接口,你可以从RouteBase中继承一个类。让你可以控制URL匹配,参数如何解析,URL链接如何生成。从RouteBase继承,你需要实现2个方法:
py3study
2020/01/03
5820
精通MVC3摘译(3)-自定义路由系统
ASP.NET MVC Preview生命周期分析
做ASP.NET WebForm开发都知道,ASP.NET有复杂的生命周期,学习ASP.NET MVC就要深入理解它的生命周期。今天从CodePlex上下载了ASP.NET Preview 2 的源代码,还有两个程序集Routing与Abstractions并未发布,不过这两个程序集的类并不多,可以用NET反编译工具 Reflector解开来看看,可惜这两个程序集用的是VS2008使用.net 3.5开发的,用了c# 3.0的很多特性,Reflector反编译不完全。 ASP.NET MVC通过HttpMo
张善友
2018/01/30
1.5K0
ASP.Net请求处理机制初步探索之旅 - Part 3 管道
开篇:上一篇我们了解了一个ASP.Net页面请求的核心处理入口,它经历了三个重要的入口,分别是:ISAPIRuntime.ProcessRequest()、HttpRuntime.ProcessRequest()以及HttpApplication.Init()。其中,在HttpApplication的Init()方法中触发了请求处理管道事件的执行,本篇我们就来看看所谓的请求处理管道。
Edison Zhou
2018/08/20
1.2K0
ASP.Net请求处理机制初步探索之旅 - Part 3 管道
ASP.NET的路由系统:URL与物理文件的分离
表现为请求地址与目标Controller和Action的动态映射的URL路由系统并不是专属于ASP.NET MVC,而是直接建立在ASP.NET 中。ASP.NET通过URL路由系统实现了请求地址与物理文件的分离。[源代码地址从这里下载] 一、URL与物理文件的分离 对于一个 ASP.NET Web Form应用来说,任何一个请求都对应着某个具体的物理文件。部署在Web服务器上的物理文件可以是静态的(比如图片和静态HTML文件等),也可以是动态的(比如.asxp文件)。对于静态文件的请求,ASP.NET直接
蒋金楠
2018/01/15
1.2K0
ASP.NET的路由系统:URL与物理文件的分离
【ASP.NET Core 基础知识】--路由和请求处理--Attribute路由
在ASP.NET Core中,路由是将传入的URL请求映射到正确的控制器和操作的方法。Attribute路由是一种基于属性,用于定义路由规则的方式,通过在控制器类和操作方法上应用特定的属性,来定义URL模板。
喵叔
2024/05/24
2470
Asp.Net MVC3 简单入门第一季(四)详解Request Processing Pipeline
      很久没更新了,今天写点关于Asp.Net MVC的PipeLine。首先我们确认一点,Asp.Net WebFrom和Asp.Net MVC是在.Net平台下的两种web开发方式。其实他们都是基于Asp.Net Core的不同表现而已。看下面一张图,我们就能理解了WebForm和Asp.Net MVC的一个关系了。
老马
2022/05/10
6270
Asp.Net MVC3 简单入门第一季(四)详解Request Processing Pipeline
.net core 源码解析-mvc route的注册,激活,调用流程(三)
mvc的入口是route,当前请求的url匹配到合适的route之后,mvc根据route所指定的controller和action激活controller并调用action完成mvc的处理流程。下面我们看看服务器是如何调用route的。 core mvc startup基本代码。重点在AddMvc和UseMvc
旺财的城堡
2018/11/20
1.1K0
ASP.NET的路由系统:路由映射
总的来说,我们可以通过RouteTable的静态属性Routes得到一个基于应用的全局路由表,通过上面的介绍我们知道这是一个类型的RouteCollection的集合对象,我们可以通过调用它的MapPageRoute进行路由映射,即注册URL模板与某个物理文件的匹配关系。路由注册的核心就是在全局路由表中添加一个Route对象,该对象的绝大部分属性都可以通过MapPageRoute方法的相关参数来指定。接下来我们通过实现演示的方式来说明路由注册的一些细节问题。 目录 一、变量默认值
蒋金楠
2018/01/15
2.3K0
ASP.NET的路由系统:路由映射
ASP.NET路由系统实现原理:HttpHandler的动态映射
我们知道一个请求最终通过一个具体的HttpHandler进行处理,而我们熟悉的用于表示一个Web页面的Page对象就是一个HttpHandler,被用于处理基于某个.aspx文件的请求。我们可以通过HttpHandler的动态映射来实现请求地址与物理文件路径之间的分离。实际上ASP.NET路由系统就是采用了这样的实现原理。如下图所示,ASP.NET路由系统通过一个注册到当前应用的自定义HttpModule对所有的请求进行拦截,并通过对请求的分析为之动态匹配一个用于处理它的HttpHandler。HttpHa
蒋金楠
2018/01/15
1.7K0
ASP.NET路由系统实现原理:HttpHandler的动态映射
ASP.NET MVC路由扩展:链接和URL的生成
ASP.NET 路由系统通过注册的路由表旨在实现两个“方向”的路有功能,即针对入栈请求的路由和出栈URL的生成。前者通过调用代表全局路由表的RouteCollection对象的GetRouteData方法实现,后者则依赖于RouteCollection的GetVirtualPathData方法,而最终还是落在继承自RouteBase的路由对象的同名方法的调用上。为了编程的方面,ASP.NET MVC为了设计了HtmlHelper和UrlHelper这两个帮助类,我们可以通过调用它们的ActionLink/R
蒋金楠
2018/01/15
1.7K0
ASP.NET MVC路由扩展:链接和URL的生成
ASP.NET MVC是如何运行的[2]: URL路由
在一个ASP.NET MVC应用来说,针对HTTP请求的处理和相应定义Controller类型的某个Action方法中,每个HTTP请求的目标对象不再像ASP .NET Web Form应用一样是一个物理文件,而是某个Controller的某个Action。目标Controller和Action的名称包含在HTTP请求中,而ASP.NET MVC的首要任务就是通过当前HTTP请求的解析得到正确的Controller和Action的名称。这个过程是通过ASP.NET MVC的URL路由机制来实现的。 一、Ro
蒋金楠
2018/02/07
1.8K0
ASP.NET Web API路由系统:Web Host下的URL路由
ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于不同的应用程序中。如果采用Web Host的方式将定义Web API寄宿于一个Web应用之中,其实最终的URL路由还是通过ASP.NET本身的路由系统完成的,那么两个路由系统之间是如何衔接在一起的呢?。 目录 一、HostedHttpRoute 二、HttpWebRoute
蒋金楠
2018/01/15
1.7K0
ASP.NET MVC Controller激活系统详解:总体设计
我们将整个ASP.NET MVC框架划分为若干个子系统,那么针对请求上下文激活目标Controller对象的子系统被我们成为Controller激活系统。在正式讨论Controller对象具体是如何被创建爱之前,我们先来看看Controller激活系统在ASP.NET MVC中的总体设计,了解一下组成该子系统的一些基本的组件,以及它们对应的接口或者抽象类是什么。 目录 一、Controller 二、 ControllerFactory 三、ControllerBuilder     实例演示:如何提
蒋金楠
2018/01/15
1.7K0
ASP.NET MVC Controller激活系统详解:总体设计
快速入门系列--MVC--02路由
    现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯。通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性、可读性、SEO优化。接下来通过一个最简单的路由例子进入这部分的学习,这是一个蒋老师提供的WebForm路由的例子,回想起刚做ASP.NET时,每次看到.aspx页面的前台代码时的茫然和无措,茫茫多的标签,属性,数据源的绑定吓死小兄弟俺了,也花过不少时间去理解记忆,效果不也不大。现在回头看看感觉好了很多,看到IsPostback老
用户1216676
2018/01/24
8720
快速入门系列--MVC--02路由
[转]ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL
在初级篇中,我们介绍了如何利用基于ASP.NET MVC的Web程序中的Global文件来简单的重写路由。也介绍了它本身的局限性-依赖于路由信息中的键值对:
徐大嘴
2019/03/21
1.5K0
ASP.NET Core的路由[2]:路由系统的核心对象——Router
ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路由参数的形式解析出来供后续请求处理流程使用。但是具体的路由解析功能其实并没有直接实现在RouterMiddleware中间件中,而是由一个Router对象来完成的。[本文已经同步到《ASP.NET Core框架揭秘》之中] 目录 一、IRouter接口 二、RouteContext 三、RouteData 四、Route 五、RouteHan
蒋金楠
2018/03/27
1.9K0
ASP.NET Core的路由[2]:路由系统的核心对象——Router
推荐阅读
相关推荐
ASP.NET MVC路由扩展:路由映射
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文