本節書摘來自異步社群《精通 asp.net mvc 4》一書中的第1章,第1.1節,作者: 【美】adam freeman ,譯者: 李萍 , 徐燕萍 , 林逸 , 更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
精通 asp.net mvc 4
asp.net mvc是微軟的一個web開發架構,它整合了“模型—視圖—控制器(mvc)”架構的高效與整潔、靈活開發最新的思想與技術以及目前asp.net平台的精華部分。asp.net mvc可以完全替代傳統的asp.net web form,除了一些微不足道的web小項目之外,在各種web開發項目中都具有明顯的優勢。在本章中,讀者将了解微軟當初建立asp.net mvc的原因,與它的前輩和替代品之間的差別,以及asp.net mvc 4的新特性。
本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。
為了了解asp.net mvc的特色及其設計目标,有必要先來了解一下到目前為止web開發的曆史——雖然這很簡短。近年來,微軟的web開發平台演變得越來越強大,但也越來越複雜。如表1-1所示,每一個新平台都修正了它前一版本中的不足。

*cgi是web伺服器與傳回動态内容的任意可執行程式進行連接配接的一種标準方法。其規範由美國國家超級計算應用中心(ncsa)維護。
asp.net在2002年剛問世起就是一種巨大的轉移。圖1-1描述了當時微軟的技術堆棧。
(注:此圖的含義為,web form建立在asp.net之上,而asp.net又建立在.net平台之上,mvc所起的作用是替代這裡的web form——譯者注)
通過将使用者界面(ui)模拟為伺服器端控件對象層的辦法,微軟試圖利用web form把http(具有無狀态本質)和html(當時許多開發人員尚不熟悉)都隐藏起來。每個控件在請求期間都跟蹤自己的狀态(通過使用view state工具),在需要時把自己渲染成html,并自動地将用戶端事件(如按鈕點選)與相應的伺服器端的事件處理器代碼相關聯。結果,web form被設計成在web上傳遞傳統的事件驅動式圖形使用者界面(gui)的一個巨大的抽象層。
其思想是,讓web開發在感覺上與windows form開發相同。開發者不再需要以一系列獨立的http請求和響應進行工作,可以認為它是一種狀态化的ui。人們可以忘記web及其無狀态本質,轉而用一種“拖—放”式設計器來建立ui,并設想——或至少假裝——所有事情都發生在伺服器上。
傳統的asp.net web form開發曾是一種了不起的思想,但事實證明它更加複雜。随着時間的推移,web form在實際項目中顯現出了一些缺陷。
視圖狀态重負:跨請求地維護狀态的實際機制(稱為視圖狀态,view state)導緻在用戶端與伺服器之間傳輸大塊資料。這種資料即使在最适度的web應用程式中也達到幾百kb,而且它來回于每次請求之間,導緻響應時間很慢,增加了伺服器的帶寬需求。
頁面生命周期:連接配接用戶端事件與伺服器端事件處理器代碼的機制(是頁面的部分生命周期)格外複雜和棘手。很少有開發者在不産生view state錯誤或不發現某些事件處理器莫明失效的情況下,能夠在程式運作期間成功地維護控件層。
關注分離的錯誤觀念:asp.net的背景代碼模型提供了一種手段,把應用程式代碼從它的html标記中提取出來,并放到一個獨立的背景代碼類中。這種邏輯與表現的分離曾得到廣泛的贊許,但事實上,卻又鼓勵開發者在這些怪異的背景代碼類中,把表現代碼(如操縱伺服器端控件樹)與它們的應用程式邏輯(如維護資料庫資料)混在一起。最終結果是脆弱和難以了解。
html上的受限控制:伺服器控件将自己渲染成html,但并不是使用者所希望的那種必要的html。在asp.net 4之前,這種html輸出通常不符合web标準,或不能很好地使用層疊式樣式表(css,cascading style sheets)。而且,伺服器控件會生成不可預知且複雜的id标簽屬性值,這些id難以用javascript進行通路。這些問題在asp.net 4和asp.net 4.5中改善了不少,但要得到人們所期望的html,仍然是需要技巧的。
有缺陷的抽象:web form試圖盡可能地隐去html和http(這是通過web form的抽象層實作的——譯者注)。當使用者試圖實作自定義行為時,時常需要放棄這種抽象,這迫使使用者需要采取回發事件機制的逆向工程,或采取笨拙的方法(這樣才可能繞過web form的抽象層,但給程式設計造成了難度——譯者注),以使它生成所希望的html。這種抽象可能對有能力的web開發者構成一個極大的障礙(由于程式設計難度,給希望實作自定義行為的開發人員造成了一定障礙——譯者注)。
低可測試性:asp.net的設計者們恐怕未曾預料到,自動測試會成為軟體開發的主要成分。是以,他們設計的這種緊耦合體系結構不适合單元測試也就不足為奇了。內建測試也很具挑戰性。
asp.net一直在不斷改進,2.0版添加了一組标準的應用程式元件,可以減少開發者需要自行編寫的代碼量。2007年釋出的ajax是微軟對web 2.0/ajax瘋狂時代的回應,它支援富用戶端互動,同時也簡化了開發者的工作。随着asp.net 4的釋出事情又改進了很多,它第一次以嚴肅的方式迎合web标準。最新版的asp.net 4.5實際上采用了asp.net mvc的一些新特性,并将它們運用于web form領域,這解決了一些較棘手的問題。不過,即便如此,許多固有的局限性依然存在。