Adam Applied ASP.NET 4 in Context
1 介绍Routing系统
在引入MVC之前,ASP.NET假定被请求的URLs和服务器硬盘上的文件之间有着直接关系。服务器的任务是从浏览器接受请求,从相应文件分发请求。
这种工作方式只是用与Web Forms,每个ASPX页面都是一个文件,它有独立的回应请求的相应。
要处理MVC URLs,ASP.NET平台是用routing系统。在这章,我们展示如何设置和使用routing系统,来创造强大且灵巧的URL处理。routing系统可以让你创造任何你想要的URLs模式,将他们清楚,简明的方式表达出来。
routing系统有两个功能:
- 检查进入的URL 1100.210,并估计出被请求的controller和action。当我们接收到客户端请求,这是你想让routing系统做的。
- 生成外向的URLs。
在本章的第一部分,我们会关注定义routes,并使用它们处理进入的URLs,这样我们能到达controller和action。我们会展示如何使用这些routes生成要在HTML上显示的外向URLs
尽管ASP.NET MVC框架需要routing系统,但是也能用于其他ASP.NET技术,包括Web Forms。因此,routing系统类被装配在System.Web,而不是System.Web.Mvc。
当你创建一个新的MVC应用,你会看到VS已经添加了System.Web.Routing装配的引用。
1.1 创建Routing项目
要展示routing系统,我们需要一个项目,来添加routes。使用Internet Application模板创建一个新的MVC应用,叫做UrlsAndRoutes。我们选择这个模板,是因为它给我们一些现成的controller和action。
Routes被定义在Global.asax.cs中,它是Global.asax的后端代码文件。
应用第一次开始时,底层ASP.NET平台调用Application_Start方法,这导致RegisterRoutes方法被调用。这个方法的参数是静态属性RouteTable.Routes的值,它是RouteCollection类的实例。
我们可以删除从RegisterRoutes方法默认被添加的routes,因为我们想要展示多样的技术,来创建路由和可用的不同类型的路由。
1.3 介绍URL模式
Routing系统不可思议地使用一组routes工作。这些routes共同组成程序的URL schema或scheme,它是程序会识别或襄阳的一组URLs。
你不需要手动地产生每个URLs。每个route包含一个URL模式,它用来比较进入的URL。如果模式匹配URL,routing系统用它来会处理URL。
URLs可以被分隔成片段,通过/分隔。这个URLs包括一个域名,两个部分的片段。我们要将它表达为路由系统可以理解的关系。这个URL模式是
当处理一个进入的URL,路由系统的工作是匹配URL到模式,然后根据模式中的定义,为片段变量提取URL的值。片段变量使用花括号{}表达,例子中有两个片段变量,controller和action。
我们将匹配到一个模式,因为MVC应用汇总是有很多routes,路由系统会比较进入的URL到URL模式的每个route,直到它发现匹配。
路由系统没有任何controller和action的概念。它只是为片段变量提取值,并传递他们到请求管线。当请求完全抵达MVC框架,会进入管线,指派controller和action变量。这是为什么路由系统可以用在Web Form,并且可以创建自己的变量。
默认地,URL模式会匹配任何有正确片段数量的URL。例如,示例的模式会匹配任何有两个片段的URL。
Request URL | Segment Variables |
http://mysite.com/Admin/Index | controller=Admin action=Index |
http://mysite.com/Index/Admin | controller=Index action=Admin |
http://mysite.com/Apples/Oranges | controller=Apples action=Oranges |
http://mysite.com/Admin | 不匹配,片段太少 |
http://mysite.com/Admin/Index/Soccer | 不匹配,片段太多 |
- URL模式是保守的,会匹配有着相同片段数量的URLs。
- URL模式是*的,如果URL有着正确片段数量,模式会为片段变量提取值
这是默认的行为,是理解URL模式功能的关键。我们提到过,路由系统不知道任何关于MVC应用,所以URL提出来的值没有响应的controller或action,URL模式会匹配。
3 创建并注册一个简单的Route
Route myRoute =new Route("{controller}/{action}", new MvcRouteHandler());
routes.Add("MyRoute", myRoute);
}
一旦心理有一个URL模式,你可以使用它定义一个router。我们创建了一个新的route对象,将我们的URL模式传入构造参数。我们也传递一个MvcRouteHandler的实例。不同的ASP.NET技术提供不同的类来缝合route。我们使用Add方法将它添加到RouteCollection对象,传递一个给他起的名字,并传递我们创建的route。
给routes起名字是可选的,这有一个会牺牲整齐的关注点分离的routing。我们会解释着为什么会成为一个问题。
注册routes更轻松的方式,是使用RouteCollection类中定义的MapRoute方法。
MapRoute方法只有MVC应用中有。ASP.NET Web Forms应用中有一个同样定义在RouteCollection类中的MapPageRoute方法。
3.1 测试进入URLS的单元测试
我们记得,你单元测试routes,确保他们像预期的那样处理进入的URLs。在一个应用中,URL架构会相当复杂,很容易创建一些意外的结果。
在之前的章节,我们回避创建一个公共的helper方法。本章,我们改变做法。测试一个应用的路由架构需要充分地做,当你能在一个单一的方法中分很多批测试,使用helper方法会变得简单。
我们需要mock三个类:HttpRequestBase,HttpContextBase,HttpResponseBase。这三个类放在一起,重建了路由系统的MVC基础设施。