第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需要加新元素。

image

上面的代码构造了一个虚拟路径,它指向了Page等于下一页的真正的数。它创建了一个新的RouteValueDictionary类,它记载了每个URL对应的信息,所有参数值的名称和参数的值。

 

追加参数

-如果生成url参数给定值超过匹配项目,则会在VD(RouteValueDictionary)中生成一条新的参数匹配记录,这一记录会被作为参数追加到url后,使用
?连接

-连接方式是url?参数名称=参数值

 

完整范例

image

image


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对象中。

 

约束

-为路由加入用户自定义约束

image

这五个参数都可以由我们重载。例如如果我们要约束请求必须是Get不能是Post,那么就重载HttpContextBase,对它的方法判定。

image

MapRoute的第四个参数是约束对象。

 

Route扩展

-让route匹配任意多参数

image

image

image

image

image

 

编辑Routes

image

image

 

使用Cache监控代码

image

使用工厂模式关注Routes使用的文件

image

 

在WebForm中使用Routing

-ASP.Net 4中使用Routing

-ASP.Net 3.5中使用Routing

 

ASP.Net WebForm 4

image

image

image

image


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

你可能感兴趣的:(Routes)