【Pro ASP.NET MVC 3 Framework】.学习笔记.12.ASP.NET MVC3的细节:URLs,Routing和Areas

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。

1 http: // mysite.com/Admin/Index

URLs可以被分隔成片段,通过/分隔。这个URLs包括一个域名,两个部分的片段。我们要将它表达为路由系统可以理解的关系。这个URL模式是

1 {controller} / {action}

当处理一个进入的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

1 public static void RegisterRoutes(RouteCollection routes) { 2 3 Route myRoute = new Route( " {controller}/{action} " , new MvcRouteHandler()); 4 routes.Add( " MyRoute " , myRoute); 5 }

一旦心理有一个URL模式,你可以使用它定义一个router。我们创建了一个新的route对象,将我们的URL模式传入构造参数。我们也传递一个MvcRouteHandler的实例。不同的ASP.NET技术提供不同的类来缝合route。我们使用Add方法将它添加到RouteCollection对象,传递一个给他起的名字,并传递我们创建的route。

给routes起名字是可选的,这有一个会牺牲整齐的关注点分离的routing。我们会解释着为什么会成为一个问题。

注册routes更轻松的方式,是使用RouteCollection类中定义的MapRoute方法。

1 routes.MapRoute( " MyRoute " , " {controller}/{action} " )

MapRoute方法只有MVC应用中有。ASP.NET Web Forms应用中有一个同样定义在RouteCollection类中的MapPageRoute方法。

3.1 测试进入URLS的单元测试

我们记得,你单元测试routes,确保他们像预期的那样处理进入的URLs。在一个应用中,URL架构会相当复杂,很容易创建一些意外的结果。

在之前的章节,我们回避创建一个公共的helper方法。本章,我们改变做法。测试一个应用的路由架构需要充分地做,当你能在一个单一的方法中分很多批测试,使用helper方法会变得简单。

我们需要mock三个类:HttpRequestBase,HttpContextBase,HttpResponseBase。这三个类放在一起,重建了路由系统的MVC基础设施。

你可能感兴趣的:(framework)