爲何要堅持用ASP.NET MVC!(②)

儘管ASP.NET MVC架構和Web Form架構區別很大,可是仍是有不少共同之處。畢竟它們都是以ASP.NET API與.NET框架爲基礎構建的。比較一下ASP.NET MVC和Web Form框架,以便知道有多少Web Form的概念與ASP.NET MVC開發相關。也許咱們不知道,基於.NET平臺開發網站的框架,實際上能夠分紅兩個部分:可視化用戶界面(Web Form)後臺Web組件(ASP.NET)。二者能夠經過它們的命名空間區分開:全部System.Web.UI.*命名空間下的內容能夠稱爲Web Form,而System.Web.*命名空間下的其餘內容能夠稱爲ASP.NET。與Web Form同樣,ASP.NET MVC(全部類都在System.Web.Mvc命名空間下)也是基於ASP.NET平臺構建的。因此兩個平臺能夠十分類似,也能夠徹底不一樣,這取決於怎麼看待這個問題。web

HTTP處理程序和模塊

你們應該對使用Visual Studio編輯ASP.NET MVC網站及其項目不會感到陌生,這和Web Form網站開發同樣,都是基於.NET平臺的應用程序。還可能要注意另一些共享文件,好比web.configGlobal.asax,它們在ASP.NET MVC 和 Web Form應用中起着重要做用。Web.config文件是一個XML文本文件,它用來儲存ASP.NET Web應用程序的配置信息,而Global.asax 文件,又稱爲ASP.NET 應用程序文件,提供了一種在一箇中心位置響應應用程序級或模塊級事件的方法。ASP.NET MVC和Web Form共享的最著名的部分應該就是HTTP處理程序和模塊(Handler and Modele)。雖然大部分Web Form API(System.Web.UI命名空間下)不會在ASP.NET MVC程序下運行,可是HTTP處理程序和模塊確實是ASP.NET(System.Web)API的一部分,因此它們仍然會在ASP.NET MVC上下文裏發揮做用。事實上,ASP.NET MVC管道自己正是從使用HTTP處理程序,處理外部請求開始的。數據庫

管理狀態

管理狀態即與用戶相關的數據,在每一個程序裏都是個很是重要的內容,Web的無狀態性致使Web應用程序中的管理狀態數據變得至關複雜。爲了處理管理狀態這個問題,ASP.NET Web Form引入了「視圖狀態」的概念。每一個請求的狀態數據,在序列化以後會臨時儲存在頁面的隱藏域控件裏,隨後的請求都會回傳這些數據。視圖是ASP.NET Web Form的重要部分,幾乎每一個頁面和組件都會或多或少依賴於它。視圖狀態抽象也有它的缺陷,每一個包含視圖狀態的請求必須以Form Post方式提交給服務器,而那些隱藏域的數據大小使人頭疼:平時用不到,有時候卻又很是大。最後它成爲Web Form的性能瓶頸。瀏覽器

ASP.NET MVC具備徹底不一樣的狀態管理方法,它留給開發人員去實現。最重要的是,ASP.NET MVC徹底拋棄了視圖狀態機制。除了視圖狀態,ASP.NET還提供了其餘幾種狀態管理方法,一樣能夠在ASP.NET MVC裏使用。例如,可使用ASP.NET緩存和會話狀態,或者HttpContext.Items API,這些能夠幫助你在MVC應用程序裏管理狀態。緩存

部署和運行時

ASP.NET MVC的產品環境部署和Web Form程序同樣。這意味着以前學習的關於部署和維護ASP.NET程序的任何東西,好比IIS七、.NET應用程序池、跟蹤、錯誤調試和部署程序集bin文件夾等,一樣能夠應用到ASP.NET MVC程序的部署中來。雖然ASP.NET MVC和Web Form程序採用了不一樣的架構,可是,從根本上說,二者都是部署並執行.NET代碼來處理HTTP請求的。服務器

#下表列出了ASP.NET MVC和Web Form的區別:
     Web Form                                             ASP.NET MVC

   視圖和邏輯緊密耦合                                    視圖和邏輯被分離
   頁面(基於文件的URL)                              控制器(基於路由的URL)
   狀態管理(視圖)                                        自動化的視圖管理
   Web Form語法                                         自定義語法(Razor
   服務器控件                                                 HTML與CSS(JQuery
   母版頁                                                       佈局
   用戶控件                                                    部分視圖
架構

應用程序業務和視圖分離:
ASP.NET MVC和Web Form最大的區別就是它們各自採用基礎架構概念。例如,Web Form框架引入初期,就聲稱相比前任ASP框架能提供分離關注點的支持,ASP強制開發人員把業務邏輯和頁面標記語言混合在單個頁面裏。WebForm框架不只可讓業務邏輯和標記語言代碼分離,還能夠提供更強大的開發平臺—.NET框架,能夠基於此平臺編寫業務邏輯代碼。可是,儘管Web Form框架相比傳統的ASP框架更加先進,可是它依然關注於「網頁」;雖然其代碼可移植到別的地方,可是仍然很難作到業務邏輯代碼和用戶視圖分離。
ASP.NET MVC經過集成鬆耦合組件來處理請求,構建於「分離關注點」概念之上。這個方法隔離了單個的組件開發,不只有利於開發生命週期,更有利於組件的單元測試。一樣,它也讓動態處理請求更加方便。
框架

URL和路由:
Web Form架構下,每一個網站的URL由單個的物理文件.aspx表示,並且每一個頁面與單個頁面類緊密耦合,頁面沒法動態選擇本身綁定的類,代碼隱藏類沒法渲染別的視圖。Web Form框架基於頁面的請求處理方式與ASP.NET MVC的請求處理方式造成鮮明的對比:後者依賴於複雜的路由規則動態映射外部的URL到正確的控制器操做上,並容許操做動態指定要顯示給用戶的視圖。
例如,請求處理管道在處理來自用戶瀏覽器跳轉到URL /auctions/details/123的結果和處理AJAX請求的結果可能不一樣,這是由於AJAX請求消息頭裏包含了一個標識AJAX請求的數據。用戶直接訪問URL時,服務器可能返回包含整個頁面內容的HTML代碼、JavaScript和CSS;而AJAX請求返回的只是Auction對象的序列化數據。此外,服務器可能選擇不一樣的格式來序列化Auction對象,好比JSON或者XML,這些取決於請求要求的數據格式。Web Form框架自己並不支持這種動態處理請求的功能,須要藉助HTTP處理程序和HTTP模塊才能實現。
佈局

狀態管理:
ASP.NET MVC和Web Form最具爭議的區別也許就是它們如何跨請求處理用戶的狀態信息,特別是ASP.NET MVC拋棄了視圖狀態。爲何要刪除這麼重要的功能呢?簡單地說就是ASP.NET MVC徹底擁抱了Web標準的無狀態的屬性。爲了更好地理解這種設計的初衷,咱們先來回顧Web Form的歷史。除了比ASP提供了更好的開發平臺外,Web Form框架的另一個特色就是引入了一種厚重的原生客戶端應用開發技巧,好比「拖放控件」以及快速開發RAD的概念到Web開發中。爲了體驗原生客戶端應用開發,Web Form必須在Web開發的基礎概念如HTML標籤以及CSS之上抽象出一層。原生應用程序開發中最重要的概念就是有狀態的(stateful),這意味着應用知道交互的用戶狀態,而且能夠在跨應用之間重用狀態信息。Web是基於HTTP請求的,每一個請求對應一個客戶端請求和一個服務器應答。Web服務器必須分開處理每一個請求,所以沒法知道客戶端請求的先後消息,這就讓服務器和客戶端沒法進行有效的會話。爲了在無狀態的中介上實現有狀態的交互,必須抽象出一層,這樣,視圖狀態就誕生了。簡單地說,視圖狀態序列化了客戶端和服務端之間的交互狀態信息,並把它們存儲在每一個頁面的隱藏域裏,隨後發送給客戶端。客戶端須要在後續的請求中把這些會話狀態信息傳回給服務端。
MVC框架保留了Web無狀態的本性,但並無提供相似視圖狀態的機制,而是利用了緩存和會話狀態。相反,ASP.NET MVC框架但願客戶端請求包含全部須要的數據,以便於服務端處理它們。例如,ASP.NET MVC應答消息也許可使用Auction的ID,而不是從數據庫裏查詢出Auction數據後序列化整個對象發送給客戶端,並在後續請求裏再回傳給整個對象。後續請求能夠直接使用Auction的ID,ASP.NET MVC控制器可使用它從數據庫裏查詢Auction數據。顯然,以上兩種方法各有千秋。視圖狀態讓客戶端和服務端的交互更加簡單,可是它包含的數據可能會變得臃腫,佔用大量的帶寬性能不好。換句話說,視圖狀態意味着開發人員能夠省去不少麻煩,但會以佔用帶寬爲代價。固然,若是開發人員不考慮每一個頁面的存儲數據,則問題可能會變得更糟。ASP.NET MVC的方法能夠從某種程度上削減頁面內容,可是可能增長後臺處理請求和數據庫請求的成本,這也是MVC框架有待改進的地方。
性能

佈局與母版頁:
最後,咱們來看一下視圖中最重要的、最基礎的概念之一:佈局(layout)。它能夠定義頁面結構以及網站主題,而且與全部的頁面共享這個主題。這個概念相似於ASP.NET Web Form中的母版頁(master page),在ASP.NET MVC框架中稱之爲佈局。MVC佈局可讓開發人員定義每一個頁面共享的HTML代碼。與母版頁同樣,ASP.NET MVC佈局容許開發人員指定多個內容塊。與Web Form的內容頁同樣,ASP.NET MVC視圖也能夠指定想要在哪一個視圖裏渲染。但有一個重要區別:對ASP.NET MVC管道來講,設置僅僅做爲「推薦」,咱們也能夠隨意修改視圖的佈局,包括刪除或者徹底使用無佈局來渲染視圖,好比在Ajax請求的狀況下。
單元測試

要點總結

若是你擁有多年的Web Form開發經驗,那麼學習ASP.NET MVC時可能也有障礙:除了它們的許多共同點和類似性以外,ASP.NET MVC和Web Form框架架構和設計目標在根本上是不一樣的。若是你習慣於「Web Form方式」,並且喜歡把這些方法用到ASP.NET MVC中來,那麼可能會帶來問題。正如以前介紹的「最重要的」和「危險的」的區別就是Web Form盡全力引入並維護視圖狀態,而MVC沒有。從技術角度來講,這個問題就是從Web Form轉向ASP.NET MVC開發時再也不有視圖狀態,ASP.NET Web Form中大部分「狀態性的」東西都不會再出現了。ASP.NET MVC的方式是經過一個臨時媒介來存儲這些數據,好比會話狀態和應用程序緩存。

另外一個編寫代碼時的最大區別就是Web Form依賴於服務器控件和用戶控件,而MVC使用HTML和部分視圖或第三方Jquery UI。使用Razor語法很是精簡高效,替代ASPX視圖引擎是很好的選擇,也能夠用Web Form語法開發MVC視圖。這能夠給Web Form開發者一個驚喜。

相關文章
相關標籤/搜索