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。

http://mysite.com/Admin/Index

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

{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

publicstaticvoid RegisterRoutes(RouteCollection routes) {
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方法。

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基础设施。

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

  1. Pro ASP.NET MVC 5 Framework.学习笔记.6.3.MVC的必备工具

    每个MVC程序员的军火库中,都有这三个工具:一个依赖注入(DI)容器,一个单元测试框架,一个模拟工具. 1.准备一个示例项目 创建一个ASP.NET MVC Web Application的Empty ...

  2. Pro ASP.NET MVC 5 Framework.学习笔记.6.4.MVC的必备工具

    2.5.创建链式依赖 当你请求Ninject创建一个类型,它检查该类型的依赖是否声明.它也会检查该依赖是否依赖其他类型.如果这里有附加依赖,Ninject自动解决他们,并创建请求的所有类的实例.正是由 ...

  3. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  4. ASP.Net MVC开发基础学习笔记:一、走向MVC模式

    一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...

  5. ASP.Net MVC开发基础学习笔记(1):走向MVC模式

    一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...

  6. ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)

    前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...

  7. ASP.Net MVC开发基础学习笔记:五、区域、模板页与WebAPI初步

    一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...

  8. 【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序

    1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...

  9. ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步

    一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...

随机推荐

  1. 使用代码创建AutoLayout约束

    使用代码创建AutoLayout约束 1.代码创建约束的步骤 2.代码创建约束的常用方法 3.代码创建约束的原则 4.禁用Autoresizing的原因 5. 设置相对状态栏的约束,使用self.to ...

  2. 第四篇 Integration Services:增量加载-Updating Rows

    本篇文章是Integration Services系列的第四篇,详细内容请参考原文. 回顾增量加载记住,在SSIS增量加载有三个使用案例:1.New rows-add rows to the dest ...

  3. lib3ds类库

    lib3ds类库 /* * The 3D Studio File Format Library * Copyright (C) 1996-2007 by Jan Eric Kyprianidis &l ...

  4. iOS面试必看,最全梳理

    序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态 ...

  5. play项目部署

    首先对于现场的数据库,一定要谨慎谨慎再谨慎,特别是保存有重要数据的. 使用expdp命令导入数据库: 事前准备: 1.确保linux服务器上已经正确安装oracle (10g以上版本) 2.有Xshe ...

  6. 用 CSS 做轮播图

    对于用 css 实现一个轮播图的缘由,是那时候刚开始接触前端,完全还不懂 js.但是有一个项目(就是一个用来应付面试的作品)需要做一个轮播的效果,当时第一反应就是用 css3 自定义动画 -webki ...

  7. Lintcode: Rehashing

    The size of the hash table is not determinate at the very beginning. If the total size of keys is to ...

  8. 为什么接口要规定成员变量必须是public static final的呢?(转)

    在interface里面的变量默认都是public static final 的.所以可以直接省略修饰符: String param="ssm"://变量需要初始化 为什么接口要规 ...

  9. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  10. 经过本人 6 年.net 工作经验证明 .net 工资确实比 Java 低

    很久没有逛博客园了,很久没有出来吐槽了.怎么呢?生活压力大,就需要找地方吐槽. 排版不怎么好,文笔不怎么好,可以看出我不是雇佣的写手. 工作到今夏,已经有6个年头了,一直使用着.net技术,但是最近工 ...