本人历时近1年写的书《ASP.NET MVC 4框架揭秘》(电子工业出版社“博文视点”)于世界末日前得以出版,目前互动出版网已经开始接受预订。本书不是一本介绍ASP.NET MVC的入门书籍,它针对最新版本的ASP.NET MVC 4,深入剖析底层框架从请求接收到响应回复的整个处理流程(包括URL路由、Controller的激活、Model元数据的解析、Model的绑定、Model的验证、Action的执行、View的呈现和ASP.NET Web API等),并在此基础上指导读者如何通过对ASP.NET MVC框架本身的扩展解决应用开发中的实际问题。
ASP.NET MVC是一个建立在ASP.NET平台上基于MVC模式的Web开发框架,它提供了一种与传统Web Form完全不同的Web应用开发方式。ASP.NET Web Form借鉴了Windows Form基于控件和事件注册的编程模式,使Web应用的开发变得简单而快捷,但是它却使开发人员与Web的本质渐行渐远。ASP.NET MVC是一种回归,它使开发人员可以真正地面向Web进行编程,我们面对的不再是拖拉到Web页面的控件,而是整个HTTP请求和响应的流程。
这不是一本ASP.NET MVC入门书籍
个人觉得掌握ASP.NET MVC具有三个层次。了解基本的编程模式,掌握Controller和View的定义方式,知道路由如何注册以及验证规则如何定义,此为第一层次。第二个层次要求我们对ASP.NET MVC框架本身从请求接收到响应回复的整个流程具有一个清晰的认识,这包括请求如何被路由、目标Controller如何被激活、Model元数据如何被解析、Action方法如何被执行,View如何呈现等。ASP.NET MVC本身是一个极具可扩展的开发框架,合理利用其扩展性可以解决很多开发中的实际问题,而掌握ASP.NET MVC的最高层次就是凭着对框架本身的运行机制的了解准确地找到相应的扩展点,并创建相应的扩展来解决我们遇到的问题。本书不是一本ASP.NET MVC入门书籍,而是让处于第一次层次的读者快速进入第二和第三层次的书。
这是一本讲述ASP.NET MVC框架本质的书
很多.NET开发人员都在抱怨微软开发技术过快的更新频率让他们无所适从。其实他们看到的只是单纯的版本升级而已,一些本质的东西一直是“稳定”的。微软推出.NET战略已经十多年了,CLR却只有四个版本而已。最新版本的ASP.NET虽然表面上已经看不到太多最初的影子,但是整个请求处理的管道一直未曾改变。对于一项开发技术,只要我们了解了它最根本性的一些东西,不但不应该惧怕其高频率的版本更替,而应该热烈拥抱它。本书力求将关于ASP.NET MVC框架最根本的东西带给大家,而不是罗列一些简单的编程技巧。
这是一本”实用”的书
可能有人觉得这本剖析ASP.NET MVC框架运行原理的书没有什么“实际”的意义,因为我们每天的日常工作就是编程,知道了ASP.NET MVC从请求接收到响应回复之间整个处理流程并不会对我们的工作造成实质性的改变。其实这种想法是极端错误的,因为我们编写的程序最终是在ASP.NET MVC框架上运行的,程序的高效性决定于它是否能够最大限度地“迎合”框架的运行机制,所以了解ASP.NET MVC框架的运行原理有利于我们写出高质量的程序。
我个人将基于ASP.NET MVC的编程分为两类,即“面向业务编程“和“面向框架的编程”。前者根据具体的业务逻辑定义Controller和设计View,这是大部分Web开发人员的主要工作;后者则是为整个Web应用搭建一个框架,让最终的开发人员只需要关注与具体的业务逻辑,而让框架来完成所有与业务无关的部分。对于后者,我们可以充分利用ASP.NET MVC的扩展性,通过自定义的扩展来将非业务的功能自动“注入”到业务逻辑的处理流程中 ,这样不仅可以提高开发效率还能提高开发质量。本书在剖析ASP.NET MVC框架运行机制过程中几乎列出了其所有的扩展点,并且通过实例演示的形式提供了很多实用的扩展。
可以将本书视为一本“架构设计”的书
在我的周围存着这样的一些人,他们以刚毕业一两年的毕业生为主。他们大都工作勤奋、聪明好学,手中经常捧着GoF的《设计模式》,总是希望在将书中的设计模式应用到具体项目之中, 或者希望通过项目的实践来印证他们在书本上的设计模式,但是理论和实践之间的距离总让他们感到困惑。
要从真实的项目或者产品中学习“实用”的软件架构设计知识,先得确定目标项目或者产品中采用的架构思想和设计模式是正确的,而我们参与的很多项目其实被“架构”得一塌糊涂。对于像ASP.NET这样的产品,其基础架构能够在很长一段时间内保持不变,本身就证明了应用在上面的架构设计的正确性,它们不正是我们学习架构设计最好的素材吗?本书对ASP.NET MVC框架的运行机制进行了深入剖析,实际上是将ASP.NET MVC的整个设计展示在读者面前,读者朋友们也许可以将本书作为一本“架构设计”的书来读。
本书的写作特点
我想本书的读者可能很多都读过我的《WCF全面解析》。虽然内容不同,本书却可能看成是它延续,因为它们基本上采用了相同的写作手法。总的来讲我基本上采用“原理讲述、代码分析和实例证明”这个模式来介绍某个技术要点,对于一个具体的知识点,我不仅仅会告诉读者“是什么”,还会告诉读者“为什么”,以及“如何证明是这样”。除此之外,如果某个知识点在真实的项目开发中具有“实用”价值,我一般会给出一个相关的实例演示。
本书具有一个与其他中文原创或者翻译书籍截然不同的特点,那就是几乎所有的术语都采用英文,比如Controller、Model和View在本书中并没有翻译成中文“控制器”、“模型”和“视图”。因为我认为很多术语其实很难找到一个语义完全等同的中文词组或短语与之对应,对于习惯了英文作为“开发语言”的读者来说,强行翻译其实是不必要的。
这不是一本纯理论的书,而是一本“实证型”的书,在书中提供了110个可供单独下载的实例演示。这些实例在本书中具有不同的作用,有的是为了探测和证明对应的论点,有的是为了演示某种使用的编程技巧,有的直接就是一个完整的案例。
本书读者
我们说《ASP.NET MVC框架揭秘》不是一本ASP.NET MVC入门书籍,主要是因为本书在第一章并没有提供一个“Hello World”实例,关注重点主要落在ASP.NET MVC框架本身的运行机制上面,但是并不是说本书的读者需要预先对ASP.NET MVC具有多深入的认识才行。如果读者对ASP.NET MVC基本的编程模式具有一定的了解,读懂这本书是完全没有问题的。对于从未接触过ASP.NET MVC的.NET开发人员,可以通过官方网站(http://www.asp.net/mvc)来学习ASP.NET MVC。
目录
第1章 ASP.NET + MVC 1
1.1. 传统MVC模式 2
1.1.1. 自治视图 2
1.1.2. 什么是 MVC模式? 2
1.2. MVC的变体 4
1.2.1. MVP 4
1.2.2. Model 2 11
1.2.3. ASP.NET MVC与Model 2 12
1.3. IIS/ASP.NET管道 13
1.3.1. IIS 5.x与ASP.NET 13
1.3.2. IIS 6.0与ASP.NET 14
1.3.3. IIS 7.0与ASP.NET 16
1.3.4. ASP.NET管道 19
1.4. ASP.NET MVC是如何运行的? 23
1.4.1. 建立在“迷你版” ASP.NET MVC上的Web应用 23
1.4.2. URL路由 25
1.4.3. Controller的激活 29
1.4.4. Action的执行 32
本章小结 36
第2章 URL路由 37
2.1. ASP.NET路由系统 38
2.1.1. 请求URL与物理文件的分离 38
2.1.2. 实例演示:通过URL路由实现请求地址与.aspx页面的映射(S201) 38
2.1.3. Route与RouteTable 41
2.1.4. 路由映射 46
2.1.5. 根据路由规则生成URL 54
2.2. ASP.NET MVC扩展 55
2.2.1. 路由映射 55
2.2.2. 实例演示:注册路由映射与查看路由信息(S208) 57
2.2.3. 缺省URL参数 59
2.2.4. 基于Area的路由映射 60
2.2.5. 链接和URL的生成 65
2.3. 动态HttpHandler映射 70
2.3.1. UrlRoutingModule 71
2.3.2. PageRouteHandler 与MvcRouteHandler 72
2.3.3. ASP.NET路由系统扩展 73
本章小结 77
第3章 Controller的激活 78
3.1. 总体设计 79
3.1.1. Controller 79
3.1.2. ControllerFactory 83
3.1.3. ControllerBuilder 85
3.1.4. Controller的激活与URL路由 90
3.2. 默认实现 92
3.2.1. Controller类型的解析 92
3.2.2. Controller类型的缓存 95
3.2.3. Controller的释放和会话状态行为的控制 96
3.3. IoC的应用 97
3.3.1. 从Unity来认识IoC 98
3.3.2. Controller与Model的分离 100
3.3.3. 基于IoC的ControllerFactory 101
3.3.4. 基于IoC的ControllerActivator 106
3.3.5. 基于IoC的DependencyResolver 107
本章小结 110
第4章 Model元数据的解析 111
4.1. Model元数据及其定制 112
4.1.1. Model元数据层次化结构 112
4.1.2. 基本Model元数据信息 113
4.1.3. Model元数据的定制 116
4.1.4. IMetadataAware接口 128
4.2. Model元数据与Model模板 132
4.2.1. 实例演示:通过模板将布尔值显示为RadioButton(S409) 133
4.2.2. 预定义模板 134
4.2.3. DataTypeName与模板名称 142
4.2.4. 模板的获取与执行 145
4.2.5. 实例演示:通过定制Model元数据和自定义模板实现预定义列表的呈现(S412) 148
4.3. Model元数据的提供机制 155
4.3.1. 再谈ModelMetadata 156
4.3.2. ModelMetadataProvider 159
4.3.3. Model元数据提供系统的扩展 163
本章小结 164
第5章 Model绑定 166
5.1. ControllerDescriptor、ActionDescriptor与ParameterDescriptor 167
5.1.1. ControllerDescriptor 167
5.1.2. ActionDescriptor 171
5.1.3. ParameterDescriptor 175
5.2. ValueProvider 177
5.2.1. NameValueCollectionValueProvider 178
5.2.2. DictionaryValueProvider 184
5.2.3. ValueProviderFactory 190
5.2.4. ValueProviderFactories 191
5.3. ModelBinder 194
5.3.1. ModelBinder与ModelBinderProvider 194
5.3.2. ModelState与Model绑定 201
5.3.3. ModelBindingContext的创建 205
5.4. Model绑定的默认实现 206
5.4.1. 简单类型 206
5.4.2. 复杂类型 210
5.4.3. 数组 215
5.4.4. 集合 222
5.4.5. 字典 224
本章小结 228
第6章 Model的验证 229
6.1. ModelValidator与ModelValidatorProvider 230
6.1.1. ModelValidator 230
6.1.2. ModelValidatorProvider 233
6.1.3. ModelValidatorProviders 237
6.2. Model绑定与验证 242
6.2.1. ModelState 242
6.2.2. 验证消息的呈现 245
6.2.3. Model绑定中的验证 251
6.3. 基于数据注解特性的Model验证 255
6.3.1. ValidationAttribute特性 255
6.3.2. DataAnnotationsModelValidator 261
6.3.3. DataAnnotationsModelValidatorProvider 263
6.3.4. 将ValidationAttribute应用到参数上 266
6.3.5. 一种Model类型,多种验证规则 271
6.4. 客户端验证 277
6.4.1. jQuery验证 277
6.4.2. 基于jQuery的Model验证 281
6.4.3. 自定义验证 284
本章小结 287
第7章 Action的执行 288
7.1. 异步Action的定义 289
7.1.1. 基于线程池的请求处理机制 289
7.1.2. 两种异步Action方法的定义 290
7.1.3. AsyncManager 292
7.2. Action方法的执行 297
7.2.1. MvcHandler对请求的处理 297
7.2.2. Controller的执行 297
7.2.3. ActionInvoker的执行 298
7.2.4. ControllerDescriptor的同步与异步 302
7.2.5. ActionDescriptor的执行 305
7.3. 筛选器的执行 311
7.3.1. Filter及其提供机制 311
7.3.2. AuthorizationFilter 319
7.3.3. ActionFilter 328
7.3.4. ExceptionFilter 333
7.3.5. 实例演示:集成EntLib实现自动化异常处理(S713、S714、S715) 335
7.3.6. ResultFilter 348
本章小结 349
第8章 View的呈现 350
8.1. ActionResult 351
8.1.1. EmptyResult 351
8.1.2. ContentResult 352
8.1.3. FileResult 357
8.1.4. JavaScriptResult 361
8.1.5. JsonResult 364
8.1.6. HttpStatusCodeResult 366
8.1.7. RedirectResult/RedirectToRouteResult 367
8.2. ViewResult与ViewEngine 369
8.2.1. View引擎中的View 369
8.2.2. ViewEngine 370
8.2.3. ViewResult的执行 373
8.3. Razor引擎 379
8.3.1. View的编译原理 380
8.3.2. WebViewPage与WebViewPage
8.3.3. RazorView 387
8.3.4. RazorViewEngine 395
本章小结 399
第9章 ASP.NET Web API 400
9.1. Web、REST与Web API 401
9.1.1. Web如此简单 401
9.1.2. REST是什么? 402
9.1.3. ASP.NET Web API 404
9.2. 服务端管道 412
9.2.1. ASP.NET Web API管道式设计 413
9.2.2. HttpMessageHandler 414
9.2.3. HttpServer 417
9.2.4. 实例演示:自定义HttpMessageHandler实现HTTP方法重写(S903) 422
9.3. HttpControllerDispatcher 423
9.3.1. HttpController的激活 424
9.3.2. HttpController的执行 435
9.3.3. Action的选择 436
9.3.4. Model元数据的解析 442
9.3.5. Action参数绑定 444
9.3.6. Model验证 456
9.3.7. Action的执行与结果的响应 460
9.4. Web API的调用和自我寄宿 463
9.4.1. HttpClient 463
9.4.2. HttpSelfHostServer 468
本章小结 471
第10章 案例实践 473
10.1. 功能性简介 474
10.1.1. 商品列表的呈现 474
10.1.2. 定购商品 475
10.1.3. 登录与错误页面 476
10.2. 设计概述 477
10.2.1. Controller-Service-Repository 477
10.2.2. IoC的应用 481
10.2.3. AOP的应用 483
10.2.4. 异常处理 489
10.3. 编程实现 490
10.3.1. 数据表的创建 490
10.3.2. Repository 491
10.3.3. Service 495
10.3.4. 路由注册和布局 498
10.3.5. ProductController 500
10.3.6. OrderController 507
10.3.7. AccountController 512
本章小结 515