ASP.NET MVC 框架

  • 23301
  • 0
  • 2011-07-10

摘要:ASP.NET MVC 框架

【原文位址】ASP.NET MVC Framework
【原文發表日期】 Sunday, October 14, 2007 10:41 PM

過去的幾年裡,很多人要求ASP.NET的一件事情就是對使用基於model-view-controller(模型-檢視-控制器,簡稱MVC)架構來開發web應用的內建支援。

上個週末在Austin舉行的Alt.NET大會上,我首次對我的團隊正在開發的新ASP.NET MVC 框架作了一個公開的Demo。你可以在Scott Hanselman這裡的部落格上觀看我的講座的錄影。

我們將在今年稍後發佈該框架的一個公開預覽版,然後在明年的上半年將它作為完全支援的ASP.NET特性推出。

模型-檢視-控制器(MVC)框架是什麼東西?

MVC是個將一個應用的實現分成三個元件角色的框架技術:模型,檢視和控制器。

  • 在基於MVC的應用裡,Model(模型)是負責保持狀態的應用元件。這個狀態通常都持久於資料庫之中(譬如,我們也許會有一個Product(產品)類用來代表SQL中的Products資料表中的訂單資料)。
  • 在基於MVC的應用裡,View(檢視)是負責顯示用戶介面的元件。這個UI通常是使用模型資料來建立的(譬如,我們也許會生成一個Product "編輯" 檢視,根據當前Product物件的狀態,顯示文字框,下拉框和復選框等)。
  • 在基於MVC的應用裡,Controller(控制器)是處理用戶交互,操作模型和最終選擇用哪個檢視來顯示UI的元件。在MVC應用中,檢視只是用來顯示信息而已,是控制器來處理和回應用戶的輸入和交互的。

使用MVC方法的一個好處是,它有助於促進應用中模型,檢視,控制器間的關注的清晰分離。保持關注的清晰分離使得對應用的測試極其容易,因為不同應用元件間的契約的定義和表達是更明確的。

MVC模式也有利於促進紅/綠式測試驅動的開發 (TDD),通過它,你可以在你實際編寫應用程式碼本身之前首先實現自動化的單元測試,這些單元測試定義和核實了新程式碼的需求。

ASP.NET MVC 框架的一些簡要細節

在幾個星期後,相關程式碼可以下載之後,我將寫一些關於這個新的ASP.NET MVC 框架的深入性的教程文章(與此同時,想進一步瞭解它的最佳方式是觀看我的Alt.net講座的錄影):

這裡是關於ASP.NET MVC 框架的一些簡要細節:

  • 它將促進清晰的關注分離,可測試性,和TDD。MVC框架中的所以核心契約都是基於介面的,可以輕易地通過mock來模擬(包括基於介面的IHttpRequest/IHttpResponse這些基本的東西)。你可以不用在ASP.NET行程中運行控制器(這使得單元測試很快),就單元測試你的應用。你可以使用你想使用的任何單元測試框架來做單元測試,包括NUnit, MBUnit, MS Test等等。
  • 這個框架具有高度的可擴充性和可插拔性。MVC框架中所有的東西都是這樣設計的,它們可以被輕易地替換掉或者客制(譬如,你可以插入你自己的檢視引擎,路由策略(routing policy),參數序列化等等)。它還支援使用現有的依賴注入(dependency injection)和控制反轉(IoC)容器模型(Windsor, Spring.Net, NHibernate等等)。
  • 它包括一個非常強大的URL映射元件,允許你使用非常乾淨的URL來建造應用。URL不需要擁有檔案擴充,是設計來輕鬆支援SEO和REST友好的命名模式的。譬如,在我上面的專案中,我可以輕鬆地把/products/edit/4映射到ProductsController類別的Edit方法上,或者把 /Blogs/scottgu/10-10-2007/SomeTopic/ 映射到BlogEngineController類別的DisplayPost方法上。
  • MVC框架支援將現有的ASP.NET .ASPX, .ASCX,和 .Master 標識檔案當作檢視模板(view template)之用(這意味著你可以輕鬆地使用很多現有的ASP.NET特性,像嵌套的母版頁,<%= %>塊 ,宣告式服務控制項,模板,資料繫結,本地化等等)。但是,它不使用現有的將交互傳回伺服器的postback模型,取而代之的是,你將把用戶的所有交互轉給控制器類來調度,這有助於關注的清晰分離和提高可測試性(這也意味著,在基於MVC的檢視內沒有viewstate或page的生命週期之說)。
  • ASP.NET MVC框架將完全支援象forms/windows認證,URL授權,成員/角色,輸出和資料快取,session/profile狀態管理,健康監測,配置系統,以及provider架構等等現有的ASP.NET特性。

結語

如果你正在想使用MVC方式建造你的web應用的話,我認為你會發現這個新的 ASP.NET MVC 框架選項非常乾淨,而且容易使用。它將允許你在你的應用中很輕易地保持關注分離,而且有助於進行乾淨的測試和TDD。

幾個星期之後,我將撰文說明新的MVC特性的工作原理,以及如何利用它們。

希望本文對你有所幫助,

Scott

標籤: , , ,
 
【附】 Scott Guthrie對一些評語的答覆:
 
1. 【問】你可以在現有的ASPX,ASCX等。。。裡使用宣告式服務控制項,假如服務控制項需要ViewState和Page的生命週期才能工作的話,那麼在基於MVC的檢視裡使用伺服器控制項的後果是?
 
【答】檢視本身是標準的.aspx, .ascx, .master檔案,所以還是有對應的後台(code-behind)類別,你可以在其中處理控制項的render事件,以把檢視的markup與檢視的顯示邏輯乾淨地分開。
 
至於宣告式控制項,控制項模型對建造控制項而言還是一樣的,區別是,你不能使用postback特性。從邏輯上說,這就像今天建立一個沒有<form runat="server">的aspx網頁類似。所以象<asp:repeater>以及其他的控制項依舊還會工作,你要使用標準的表單提交或<a href=""> url來做post操作。
 
我們也會提供一些對MVC有意識的伺服器控制項,可以用於沒有postback的檢視頁面裡,它們將與基於控制器的邏輯很乾淨地整合。
 
2. 【問】MVC框架是否會包括在VS 2008 RTM裡?
【答】 MVC框架可以在VS 2008 RTM下工作,我們將在發佈VS 2008 RTM的同時,發佈第一個預覽版。MVC框架本身先會居於一個單獨的程式集中,然後會變成.NET 3.5 SP1的一部分。
 
3. 【問】假如我們使用MVC框架,我們是不是又回到原地了?還是會提供給我們這些認為生命是短暫的人一些適當的好處?用個比喻,我可不想每次沖淋浴,就要重建水龍頭(taps)。
 
【答】注意,MVC框架並不替代現有的web form模型,很明顯,我們將繼續完全支援並增強web form模型的功能。所有,假如你喜歡控制項postback式交互的話,我大概會建議你還是繼續目前的做法,使用基於MVP的模型來做測試。
 
而MVC模型的確在顯示HTML方面給你更多的控制。但就像你注意到的,這既有好處也有壞處,好處是你有更多的控制,壞處是,控制越多,你需要照顧的東西也越多。我們將提供很好的方式來處理錯誤和保持表單狀態,這樣你就不用寫些醜陋的編碼來處理這些東西了。對你的介面來說,伺服器控制項模型還是很好地提供了非常乾淨的方式來封裝檢視輔助(view-helper)功能,而且我們將提供一套豐富的控制項來輔助你。
 
4. 【問】Brail檢視引擎有一樣好處是,檢視是獨立於主要應用被編譯的,所以假如你對檢視做了改動,它可以立刻被重新編譯。我假定基於DLR的檢視沒有被編譯,但在aspx檢視的情形下,改動檢視是否需要重新載入應用而導致長時間的延緩呢?假如不需要的話就太好了。
 
【答】當.aspx網頁被改動後, ASP.NET監測到其變化後,會自動為它生成一個新的程式集。那樣,我們就不需要重新啟動應用了。在基於DLR的.aspx網頁的情形下,實際上我們根本不建立程式集,而可以在記憶體裡對它們做編譯,基於IronPython的.aspx 網頁就是這樣工作的。
 
注意,因為ASP.NET MVC框架是可以插拔的,你可以選用MonoRail Brail檢視引擎來顯示你的檢視。所以如果你喜歡Brail模型的話,還是可以繼續和新的MVC框架協同工作的。
5.【問】對MVC有意識的伺服器控制項能否可以從模型驗證來推出自動的客戶端驗證(譬如通過CSS屬性)?
 
【答】我們會研究,在可能的情況下,從模型的驗證,來允許處理錯誤的客戶端樣式和客戶端JavaScript錯誤驗證。但這個不會出現在幾個星期後的第一個預覽版裡,但這是我們近期看過的,以後會再研究。
 
6.【問】你是可以討論一下MVC中DLR,動態語言,LINQ和Asp.Net futures的支援?
【答】LINQ肯定會在MVC框架內完全支援,我們也會增加DLR支援,允許你使用包括IronPython和IronRuby在內的動態語言建造檢視和控制器。
 
7.【問】象UpdatePanel和其他依賴於postback模型的跟AJAX有關的特性將會得到什麼樣的支援?
【答】UpdatePanel確實使用postback,所以你無法直接在基於MVC的檢視裡使用那個控制項。但我們將提供一個跟該控制項類似功能的控制項以及相關的輔助方法。它會叫用控制器的一個方法,允許你非常容易地做局部更新。它將允許你非常輕鬆地使用ASP.NET AJAX庫。在幾個星期之後我會寫部落格討論更多細節。
 
8.【問】你的講座錄影裡的檢視程式碼看上去非常危險地像是老的asp(沒有.net)。monorail nvelocity也是如此。我希望你能綜合兩者的好處哦。
 
【答】有些人喜歡<%= %>模型,在alt.net大會上我DemoMVC模型講座的參與者都要我使用這種方法(所以我寫了那樣的程式碼),我也可以使用<asp:repeater>來做列表,通過code-behind來做資料繫結,這允許你更清晰地構造你的檢視顯示程式碼。
 
9.【問】我只是好奇,你需要對內層程式碼做多少改動才能使得宣告式伺服器控制項在不使用postback模型的情形下工作?ASP.NET MVC會在沒有<form runat="server">的頁面上支援現有的伺服器控制項麼?我們是否能夠在同一個頁面上使用多個HTML表單?
 
【答】我們實際上不用改動內層程式碼來支援MVC框架,ASP.NET 實際上已經包含大部分所需的hook了。
ASP.NET MVC框架將允許你在同一個頁面裡使用多個HTML表單。像<asp:repeater>和其他支援唯讀模式的控制項完全沒問題,但倚重於Postback的控制項是無法支援postback操作的。
 
10.【問】我注意到你在ALT.NET的Demo裡,你從控制器裡往檢視裡以 new {"value", "value2" }的形式傳遞匿名型別。我的印象是,匿名型別是無法傳到一個方法的範圍之外的。你能解釋一下麼?
 
【答】匿名型別是可以傳到他們所在範圍之外的,但型別名稱是未知的(譬如,你可以以Object型別的形式傳遞或傳回這些物件)。
 
我使用的輔助方法接受一個object作為可選的參數型別,然後使用IDictionary或反射獲取其中的名稱/陣列對。所以我可以寫
<%= Html.Link("Push Me", new { Action="Edit", ID=p.ProductId }); %>