ASP.NET MVC 3預覽版試用 多項改進詳解
今天早上,我們發布了ASP.NET MVC 3的“預覽1”(”Preview 1”)版本,你可以從http://go.microsoft.com/fwlink/?LinkID=157073下載。
從ASP.NET MVC項目一開始, 我們就使用迭代式的開發方法,并在開發周期中定期發布預覽版本。在類似今天的預覽版本中,我們的目標是獲得用戶反饋—包括你喜歡的和不喜歡的地方,你覺得有遺漏或不完善的地方。這些反饋相當的有價值—并使最終產品更加、更加地完善。
ASP.NET MVC 3
正如你所料到的,ASP.NET MVC 3就是ASP.NET MVC下一個主要發布版本。
ASP.NET MVC 3與ASP.NET MVC 2是兼容的——這也就是說,當MVC 3發布后,它便于你把MVC 2的項目更新到MVC 3上。MVC 3的新功能是建立在MVC 1和MVC 2基礎之上的,這也就意味著,你所掌握的技術,知識,類庫和書籍可以直接用到MVC 3上的。MVC 3只是加了些新的功能—不會淘汰現有的功能。
ASP.NET MVC 3 可以和ASP.NET MVC 2共存,你可以在機器上安裝今天的“Preview 1”版本,而不會影響到你現有的MVC 2項目(除非你顯式指定項目使用MVC 3,否則,它還是繼續使用MVC 2)。當你安裝完“Preview 1”版本后,會在Visual Studio 2010的“新建項目”對話框添加一些新的ASP.NET MVC 3模板—選中其中一個就會為你創建使用MVC 3的項目。
下面是關于 “Preview 1”版本一些新功能的詳細介紹。除非我特別說明,所有我這里介紹的功能在你今天可以下載和使用的預覽版本上都是可用的。將來還會根據你的反饋,有更多的新功能會隨著后續預覽版本的發布而出現。
視圖方面的改進
ASP.NET MVC 3 “Preview 1” 在視圖方面的做了很多的改進。
添加→視圖對話框
在“Preview 1”版中包括了一個新的“添加→視圖”對話框,這個對話框便于你創建視圖模板文件時選擇要用的語法。它可以讓你選擇任何一個在你的機器上安裝的視圖引擎—讓你使用任何一個你感覺自然的視圖模板。
現在已經有很多非常不錯的開源視圖模板引擎(包括Spark, NHaml, NDjango,還有一些其它的)—我們可以如今可以更方便把它們集成到Visual Studio中來。
在今天的ASP.NET MVC 3 “Preview 1”版本中,新建視圖對話框里已經有兩個自帶的視圖引擎:ASPX 和 Razor。
#p#
新的“Razor”視圖引擎
這個月早些時候,我發布了一篇關于我們正在開發的“Razor”視圖引擎的文章。從這篇文章的回復來看,已經有很多人開始期待著使用它了。好消息來了,你現在可以在“Preview 1”版本中使用它了。
簡單的Razor示例
讓我們來創建一個非常簡單的在線商店網站,它列出產品類別,然后允許訪問者通過點擊這些類別來查看相關的產品。你可以從這里下載到完整的示例程序。
下面是StoreController類,它實現了創建上述場景的兩個執行函數(“Index”和 “Browse”)。
我們將使用“Razor”視圖引擎來實現StoreController的視圖模板。
下面就是定義我們通用布局的“Layout.cshtml”布局頁面。“RenderBody()”方法用來指定在基于這個主布局頁面的視圖模板中填入內容的地方。
下面是Index執行函數的視圖模板。它是基于上面提到的布局頁面,然后輸出一個產品類別名稱的<ul>列表。
上面的模板中,用Html.ActionLink()這個標準的ASP.NET MVC 輔助函數去生成一個指向我們StoreController類中“Browse” 執行函數的鏈接。所有在ASP.NET MVC中現存的HTML 輔助函數都是可以用在“Razor”視圖中—這一點不但適用于ASP.NET MVC內置的HTML輔助函數,也適用于其他人開發的輔助函數(包括其他公司或個人和MvcContrib項目里的)。
下面是給Browse執行函數創建的視圖模板。它列出了一個類別下的產品。
注意上面我們在foreach語句中使用其Model屬性,獲取傳入Controller的強類型的產品列表的方式。這跟我們在.aspx視圖頁面的方法一樣。Razor也支持我們通過“View”屬性來獲取傳入視圖頁面的無類型“ViewData”。“View”是一個動態屬性(這是一個.NET 4的新功能)—這給我們一種很簡潔輕便的語法來訪問視圖數據(ViewData)。這樣我們只需寫View.Category,而不是ViewData[“Cateogry”]。
#p#
干凈簡潔
上面截圖中的代碼已經包括了實現我們的控制器 + 視圖要做的所有事情。“Razor”使得我們的視圖模板更加干凈簡潔,而且我想,你還會發現它的代碼流程很順暢。如果想更多的了解它的語法和它是如何工作的,請參考我的這在個月早些時候寫的關于“Razor” 的博客文章。你也可以從這里下載上面所提到的示例代碼。
代碼智能提示和加亮顯示
你可能從上面的截圖上已經注意到了一件事,在今天發布的“Preview 1” 版本里,Visual Studio還是不支持對“Razor”文件的代碼提示和加亮顯示。但我們會在后續發布的版本上予以支持。到時,VS 2010的編輯器會提供對Razor文件的C#/VB代碼提示,同時也支持HTML/CSS/JavaScript代碼提示。
后續版本中的改進
我們在后續版本中,會在如下三個方面做一些重要改進:
能夠在”Razor”文件的頂部使用@model語句,就不用顯式繼承一個基類了,這樣可以簡化代碼。
能夠給站點指定一個默認LayoutPage(布局)頁面,從而不用顯式地在每個視圖模板分別設定。這將更加減少視圖模板里的代碼,使得你的代碼看起來更干凈。
不用每次運行整個程序或者啟動一個web服務器,就能夠對“Razor”模板文件進行單元測試的能力。
根據前兩個改進,Browse模板可以簡單地寫成這個樣子:
后續版本中將會支持上面的模板語法。編輯器也支持全面的代碼加亮顯示和智能提示。
控制器方面的改進
ASP.NET MVC3 “Preview 1”包含了一些很好的針對特定控制器的改進。
全局過濾器
ASP.NET MVC 支持通過過濾機制來描述性地應用“橫切”邏輯。 你可以使用屬性語法為控制器和執行函數指定過濾器,如下所示
程序開發者常常希望將一些過濾器邏輯應用于程序中的所有控制器上。 現在ASP.NET MVC3 能夠讓你指定一個全局的過濾器,這個過濾器可以應用于程序中的所有控制器。你可以通過在RegisterGlobalFilters()函數中將它加入到GlobalFilters 集合中來實現這個目的,這個函數被包含在默認的Global.asax類模板中。(隨后它會被Application_Start()函數調用)
在MVC3中,這個過濾器的判定邏輯非常靈活,你可以配置一個全局過濾器,使它只在某些條件符合的時候才啟用(例如:啟用調試,或者針對一個請求使用特定HTTP響應等等)。 過濾器可以從一個依賴注入(DI-Dependency Injection)容器中獲取—詳見下文。
新的動態ViewModel屬性
ASP.NET MVC 控制器支持“ViewData”屬性, 這個屬性能夠使你通過延遲綁定的字典API傳入數據到視圖模板中。 例如:
ASP.NET MVC3仍然支持 “ViewData” API,但是在動態類型的控制器中,MVC3用一個新的“ViewModel”屬性增強了”ViewData” API, 這便于你在使用VB和C#支持的動態語言來傳遞ViewData的數據時,語法比當前的字典API更加輕便、簡潔。現在你可以編寫下面的代碼來得到跟上面同樣的結果:
你不需要定義任何強類型的類來使用ViewModel屬性,因為它是動態屬性,你只要使用該屬性的 get/set 方法, 在運行時會動態解析。它內部存儲了ViewData字典的屬性鍵值對。
新的ActionResult類型
ASP.NET MVC3 “Preview 1” 包含一些新的ActionResult類型和對應的輔助函數。
HttpNotFoundResult
新的HttpNotFoundResult 類用來指明:找不到當前URL請求的資源。 它會向調用客戶端返回HTTP狀態碼404。你可選擇使用新的HttpNotFound()輔助函數來返回它的一個實例, 如下例所示:
***性重定向
HttpRedirectResult類有個新的布爾類型的屬性“Permanent”,這個屬性用來指明是否會發生一個***性的重定向。 ***重定向使用的HTTP狀態碼是301。 同時Controller類現在有3個新的函數來執行***重定向:RedirectPermanent(), RedirectToRoutePermanent(), 和 RedirectToActionPermanent()。 這些函數返回一個Permanent屬性為true的HttpRedirectResult實例。
HttpStatusCodeResult
新的HttpStatusCodeResult類能夠用來顯式設置響應狀態碼及其詳細描述。
JavaScript 和 AJAX 方面的改進
ASP.NET MVC 3包含內嵌的JSON 綁定支持,能使執行函數接受JSON編碼的數據,并將數據模型綁定到執行函數的參數上。
為了理解功能的作用,請細看下面jQuery客戶端的JavaScript代碼。它定義了一個當客戶端點擊“保存”按鈕時調用的“save”事件處理程序。事件處理函數的代碼構造了一個客戶端的JaveScript“product”對象,這個對象包含3個成員域,它們的值都是從HTML的input元素獲取的。接著jQuery的ajax()方法向server端的/Store/UpdateProduct地址POST(提交)一個包含那個產品對象的JSON請求。
現在ASP.NET MVC 3 便于你在服務器上通過下面的執行函數來實現/Store/UpdateProduct URL:
上面的UpdateProduct()執行函數接受一個強類型的Product對象作為參數。ASP.NET MVC 3 能夠在服務器端自動綁定到來的JSON請求到.NET Product 類型,無需你去實現一些客戶綁定或列集邏輯。 ASP.NET MVC內置的模型和輸入驗證特性都會正常運作。
在牽涉到客戶端模板和數據綁定等場景里(參見我之前的博客),我們認為這個能力顯得尤為重要。你可以通過在客戶端執行客戶端模板來編排數據格式并顯示一個單獨的數據項或者數據集合。 ASP.NET MVC 3 能夠輕易地將客戶端模板和服務器端處理JSON數據的執行函數連接起來。
后續在JavaScript/AJAX方面的改進
后續版本里,ASP.NET MVC 3將包含更好的支持分離式JavaScript。ASP.NET MVC 3也將通過它內置的驗證輔助函數來直接支持jQuery驗證類庫。
在模型驗證方面的改進
ASP.NET MVC 2 在模型驗證方面已經有了顯著的改進。詳情請參看我之前發表的博客。
ASP.NET MVC 3又有了進一步的增強,它現在支持.NET 4在命名空間System.ComponentModel.DataAnnotations中引入了幾個新的驗證功能。
MVC 3 支持.NET 4中新的數據標記驗證元數據特性,比如說DisplayAttribute.
MVC3支持.NET 4 對ValidationAttribute類的改進。 在.NET 4中,ValidationAttribute 類引入了一個IsValid重載函數,該函數提供了關于驗證上下文更多的信息,比如說當前正在被驗證的對象。這使得我們有更加豐富的驗證手段,比如使用模型的其它屬性值來驗證當前值。
MVC 3 支持在.NET 4中引入的IValidatableObject接口。該接口支持模型層面的驗證,并且在驗證出錯時,它可以針對整個模型狀態或者模型內的兩個屬性之間關系提供一些出錯信息。
下面的例子使用IValidatableObject接口來實現自定義驗證方法。此函數可以將驗證規則應用到多個屬性上,在出錯時可以發出多種出錯信息(可以是類似下面例子中的消息或一個導致出錯屬性的名稱列表)。
ASP.NET MVC 3綁定模型時會考慮IValidateObject接口(除了使用其它一些在MVC2時就已經支持的驗證方法之外),通過該接口獲得驗證出錯的錯誤消息,在視圖中用內置的HTML表單輔助函數標記或高亮顯示受影響的字段。
ASP.NET MVC 3 還引入了另一個新的接口:IClientValidatable。在運行時,ASP.NET MVC 3通過該接口可以確定驗證器是否支持客戶端驗證,該接口的被特意設計成可以與很多驗證架構集成。此外,IMetadataAware接口也是在MVC 3 中新引入的,該接口使得創建模型元數據的過程更加簡單。
在依賴注入方面的改進
ASP.NET MVC 3更好地支持了依賴注入與DI/IoC容器的集成。
在“Preview 1”版中,我們從如下幾個方面支持依賴注入技術:
1. 控制器(注冊和注入控制器工廠,注入控制器)
2. 視圖 (注冊和注入視圖引擎,把依賴項注入到視圖頁面中)
3. 動作過濾器 (定位和注入過濾器)
在后續版本中,我們將研究在以下方面對注入技術的支持:
· 模型綁定器(注冊和注入)
· 值生成器(注冊和注入)
· 驗證方式提供程序(注冊和注入)
· 模型元數據生成器(注冊和注入)
ASP.NET MVC 3 將支持Common Service Locator 庫和所有的支持IServiceLocator 接口的DI容器。 這樣一來,使用ASP.NET MVC 集成任何支持Common Service Locator的DI容器將變得很容易。
注意:在“Preview 1”版中,我們在代碼中重新定義了CSL接口,從而在我們的安裝文件中不用包含CSL 動態鏈接庫。現有的CSL實現將不可以用在“Preview 1”版上,相反,CSL將需要針對我們的接口重新編譯才能使用。在后續版本中將更容易使用CSL,節省了這個額外的步驟。
Brad Wilson正在寫一個關于ASP.NET MVC 3 對注入依賴技術的支持方面的系列文章。 下面的連接是Brad Wilson前期的一些文章:
· ASP.NET MVC 3服務定位器:簡介(***章)
· ASP.NET MVC 3服務定位器:控制器(第二章)
· ASP.NET MVC 3服務定位器:視圖(第三章)
· ASP.NET MVC 3服務定位器:過濾器(第四章)
點擊這里下載一個簡單的ASP.NET MVC 3示例,它演示了如何在ASP.NET MVC 3中使用已廣泛應用的Ninject依賴注入容器。
下載和鏈接
點擊這里下載ASP.NET MVC 3“Preview 1”版,并在ASP.NET MVC Forum 留下您的反饋信息。
一旦安裝好ASP.NET MVC 3,你就可以下載并運行前面介紹的簡單Razor示例程序。
參閱我之前的關于“Razor”的博客了解它的工作方式和代碼語法。此外,在我最近的博客EF4 代碼優先類庫 和 EF4 代碼優先數據庫結構映射,你將看到使用EF4 代碼優先類庫和 SQL Express創建前面示例程序的數據庫結構和模型層。另外你也可以收聽Scott Hanselman的 ASP.NET MVC 3播客,或者收看Channel 9上關于ASP.NET MVC 3的視頻。
總結
我們非常興奮能夠發布ASP.NET MVC 3 “Preview 1”版,我們正在著手準備接收大家的反饋意見。
我們發布這個預覽版的最主要目的就是收集反饋意見 – 哪些地方好,哪些地方不好以及還遺漏哪些地方。您的意見對我們來說是非常寶貴的,最終會幫助我們完善產品。 如果您安裝了今天的版本,請到網站http://forums.asp.net的ASP.NET MVC論壇里提出您的意見和報告任何您發現的問題。我們的開發團隊會密切關注論壇里面的反饋意見,也很樂意幫助您解決您碰到的任何問題。
我們會逐條審閱所有的反饋意見,使更新版ASP.NET MVC 3變得更加***。
希望這能對您有所幫助。
原文標題: ASP.NET MVC 3(預覽 1)簡介
鏈接:http://blog.joycode.com/scottgu/archive/2010/08/14/116046.joy
【編輯推薦】