在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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系统有两个功能:
在本章的第一部分,我们会关注定义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。
这是默认的行为,是理解URL模式功能的关键。我们提到过,路由系统不知道任何关于MVC应用,所以URL提出来的值没有响应的controller或action,URL模式会匹配。 3 创建并注册一个简单的Route
1 publicstaticvoid 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基础设施。 |
请发表评论