第6讲:深入理解ROUTES
2010.9.6 苏鹏
内容介绍
-使用routing生成URL
-URL和Action匹配的秘密
-在WebForm中使用routing
预备知识
-安装Visual Studio 2010 Express
-了解ASP.Net
-了解设计模式基本概念
Routes如何生成URL
-双向的URL对应策略
严格说来ASP.Net MVC架构不止三层,其实它有四层,第四层就是枢纽层,即Roues对象,它是MVC架构能够赖以生存的重要的组成部分。
Url生成器概述
-1.咨询每个路由表
-2.匹配返回结果
本质上Routing系统只是对两个类的抽象:RouteCollection类和RouteBase类。
Url构造器在一开始调用的时候,需要调用RouteCollection类的GetVirtualPath方法。这个方法是返回虚拟路径用的,它是真正把路径从对应的字典列表拿出来的方法。这个方法的返回结果会传递给RequestContext,并指定为用户的路由信息,这些信息就放在字典中,接下来使用字典中的参数匹配,然后生成Url。
工作方式:
首先咨询所有的路由表,问它们:你生成的Url包含下面的参数吗?这个方式类似于匹配URL时拆分URL的方式。当有一个路由说我可以,我能返回的时候,就由它去返回一条VirtualPath实例,这个实例包含一个URL属性。如果一条都没有匹配到,就返回一个Null。然后Routing就会根据这些路由信息顺序地构造下一个路由列表。
URL生成器详细工作方式
-1.用户调用RouteCollection.GetVirtualPath
-2.匹配参数
-3.匹配默认参数
使用命名路由
默认情况下RouteCollection.GetVirtualPath并不知道那个路由来做这件事,如果指定了命名路由来查询,行或不行就很清楚了。
非指定变量的匹配
非指定变量,即一些情况下用户提交的URL包含一些别的数据,这些数据不是指定的数据,凡有这样的数据我们称之为环境变量的匹配。这些匹配中GetVirtualPath不能直接获得对象的地址,因此要用别的方法。
例如当页面做分页的时候,URL传入的参数中可能包含当前的列表页数,但是如果是对于“前一页”或者“后一页”的按钮来说,它并不知道具体是指向哪一页,因此为了控件的复用,Route需要加新元素。
上面的代码构造了一个虚拟路径,它指向了Page等于下一页的真正的数。它创建了一个新的RouteValueDictionary类,它记载了每个URL对应的信息,所有参数值的名称和参数的值。
追加参数
-如果生成url参数给定值超过匹配项目,则会在VD(RouteValueDictionary)中生成一条新的参数匹配记录,这一记录会被作为参数追加到url后,使用
?连接
-连接方式是url?参数名称=参数值
完整范例
Routes是如何把URL映射为Action
-请求路由管道
请求管道概述
1.UrlRoutingModule视图使用RouteTable里的注册路由处理当前请求。
2.如果匹配成功,则从路由对象生成IRouteHandler对象。
3.Routing模块调用IRouteHandler中的GetHandler方法,这一方法返回一个IHttpHandler。(IHttpHandler就是一个标准aspx页面的路径,它实际上跟ashx是一样的)
4.ProcessRequest对象调用HttpHandler对象响应。
5.在MVC架构中IRouteHandler对象默认是一个MvcRouteHandler对象,它返回的对象是一个MvcHandler对象。
路由匹配法则
- routedata
在本质上是由IRouteHandler对象获得请求数据和路由信息的。从宏观上来说,当一个请求过来时,UrlRoutingModule循环访问每一个RouteCollection对象中有关联的RouteTable的Routes对象,它就问,你能处理这请求吗?如果对方说行,那就交给你了。关键的是,一个路由是否能处理这个请求要调用方法GetRouteData来看,每一个Routes对象都要调用GetRouteData。如果方法返回null,说明路由不匹配。反之如果返回一个RouteData对象,则表示能匹配路由。本质上,路由和路由之间没有直接的对话,如果有人来请求是通过第三方来实现询问的。传递关键字的判定数据需要使用RouteData实现。
RouteData
RouteData实际上是RouteValueDictionary的实例,它存在于每一个MvcRouteHandler对象中。
约束
-为路由加入用户自定义约束
这五个参数都可以由我们重载。例如如果我们要约束请求必须是Get不能是Post,那么就重载HttpContextBase,对它的方法判定。
MapRoute的第四个参数是约束对象。
Route扩展
-让route匹配任意多参数
编辑Routes
使用Cache监控代码
使用工厂模式关注Routes使用的文件
在WebForm中使用Routing
-ASP.Net 4中使用Routing
-ASP.Net 3.5中使用Routing
ASP.Net WebForm 4
ASP.Net 3.5中使用Routing
-在ASP.Net 3.5中使用起来就没有4中那么便利了,当然,我们还是有办法实现的,实现的办法就是自己实现一个IRouteHandler接口,具体说来通过在WebForm中定义一个新的类,来实现这一操作。
总结
这两讲都介绍了ASP.Net MVC的枢纽Routing技术,主要介绍了三个方面:Routing正向匹配、Url过来用Routes拆解、拆解后找到对应的Controller和Action。上一讲讲的形,这一讲讲的原理。接下来讲了怎样生成URL,主要是用到RouteCollection的GetVirtualPath方法。本讲所有环境都是基于IIS7的标准环境。
2010.9.27