本人歷時近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<TModel> 384
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



