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

cgi 是web伺服器與傳回動态内容的任意可執行程式進行連接配接的一種标準方法。其規範由美國國家超級計算應用中心(ncsa)維護。
asp.net在2002年剛問世時,給web開發領域帶來了巨大的轉變。圖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在實際項目中顯現出了一些缺陷:
視圖狀态負荷:跨請求狀态維護的實際機制(稱為視圖狀态)導緻在用戶端與伺服器之間傳輸大塊資料。這種資料即使在最适度的web應用程式中也達到幾百kb,而且它來回于每次請求之間,以很長的響應時間令網站通路者不悅,且增加了伺服器的帶寬需求。
頁面生命周期:連接配接用戶端事件與伺服器端事件處理代碼的機制(是頁面的部分生命周期)格外複雜和棘手。很少有開發者在不産生視圖狀态錯誤或不發現某些事件處理程式莫明失效的情況下,能夠在程式運作期間成功地維護控件層。
關注分離的錯誤了解:asp.net的背景代碼模型提供了一種手段,把應用程式代碼從它的html标記中提取出來,并放到一個獨立的背景代碼類中。這種邏輯與表現的分離曾得到了廣泛的贊許,但在實際應用中,卻又鼓勵開發者在這些怪異的背景代碼類中把表現代碼(如操縱伺服器端控件樹)與它們的應用程式邏輯(如維護資料庫資料)混在一起。最終結果是脆弱和難以了解的。
html上的受限控制:伺服器控件将自己渲染成html,但并不是你所希望的那種必要的html。在asp.net 4之前,這種html輸出通常不符合web标準,或不能很好地使用css。而且,伺服器控件會生成不可預知且複雜的id值,結果,這些id難以用javascript進行通路。這些問題在asp.net 4中減少了,但仍然不容易得到你所期望的html。
遺漏抽象:web form試圖盡可能地隐去html和http。當你試圖實作自定義行為時,時常需要放棄抽象,這迫使你需要反過來開發回傳的事件機制,或采取笨拙的方法,以使它生成所希望的html。再則,這種抽象可能對有能力的web開發者構成一個極大的障礙。
低可測試性:asp.net的設計者們恐怕未曾預料到,自動測試會成為軟體開發的重要組成部分。是以,他們設計的這種緊耦合體系結構不适合單元測試也就不足為奇了。內建測試也很具挑戰性。
asp.net一直在不斷改進,版本2.0添加了一組标準的應用程式元件,可以減少開發者需要編寫的代碼量。2007年釋出的ajax是微軟對web 2.0/ajax瘋狂時代的回應,它支援富用戶端互動,同時也簡化了開發者的工作。最新版的asp.net 4能夠生成更易于預測且與标準相容的html标記,但依然存在許多内在的局限性。