ASP.NET MVC 3的第一個預覽版已經發布了,此次的更新帶來了更多的改進。包括視圖、控制器以及JavaScript和AJAX 方面的改進。
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。
新的“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”]。
全域過濾器
ASP.NET MVC 支援通過過濾機制來描述性地應用“橫切”邏輯。 你可以使用屬性文法為控制器和執行函數指定過濾器,如下所示
程式開發人員常常希望將一些過濾器邏輯應用程式於程式中的所有控制器上。 現在ASP.NET MVC3 能夠讓你指定一個全域的過濾器,這個過濾器可以應用於程式中的所有控制器。你可以通過在RegisterGlobalFilters()函數中將它加入到GlobalFilters 集合中來實現這個目的,這個函數被包含在預設的Global.asax類模板中。(隨後它會被Application_Start()函數調用)
在MVC3中,這個過濾器的判定邏輯非常靈活,你可以配置一個全域過濾器,使它只在某些條件符合的時候才啟用(例如:啟用調試,或者針對一個請求使用特定HTTP響應等等)。 過濾器可以從一個依賴注入(DI-Dependency Injection)容器中擷取。