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



