摘要:ASP.NET MVC 3 (RC 2) 發佈
[原文發表位置] Announcing ASP.NET MVC 3 (Release Candidate 2)
[原文發表時間] December 10, 2010 11:47 PM
今天早上ASP.NET團隊釋出了ASP.Net MVC 3 RC2, 你可以從這裡下載安裝。
快了。
今天的 RC2版本接近 ASP.NET MVC 3 最終版本。它是一個真正的「發行候選版本 (Release Candidate)」。我們希望我們不會再改動它的任何程式碼。我們今天發佈它,大家就可以對它進行最後的測試,在最後關頭發現任何重大缺陷的時候通知我們,並且大家可以開始升級程式來使用它。我們將於一月份正式發佈最終的ASP.NET MVC3 RTM 版本。
在VS2010與VS2010 SP1 Beta上都能使用
現在的 ASP.NET MVC 3 RC2 可以在 Visual Studio 2010/Visual Web Developer 2010 Express 上使用,也可以在最新發佈的VS 2010 SP1 Beta上使用。
這意味著你不一定要安裝VS2010 SP1(或SP1 Beta)來使用它。 它在已經發售的Visual Studio 2010上也能使用。VS2010 SP1新增了一些不錯的功能 (包括VS中的IIS Express和SQL CE支援) ,能讓ASP.NET Web Form 和 ASP.NET MVC 程式開發人員獲得更好的體驗,我下周將寫一篇關於它的文章。
缺陷和性能修復
今天的ASP.NET MVC 3 RC2版本包含對很多缺陷的修復和效能的最佳化。我們最近的性能測試顯示ASP.Net MVC 3 比ASP.Net MVC2更快,現有的ASP.NET MVC 程式在升級成ASP.NET MVC 3後執行效能也會有一點小小的改善。
最後的調整和Fit-N-Finish
除了修復缺陷和最佳化效能外,今天的RC2版本還包含一些最後關頭的功能調整和針對ASP.Net MVC3新功能的「fit-n-finish」改動。 我們在公開預覽中收到的回饋和建議在引導這些最後的調整中功不可沒,我們真的非常感謝這些發送回饋給我們的人的支援。
下面簡短地列出今天的版本相對上個月的ASP.NET MVC3 RC發佈版的一些功能的改動/調整。
jQuery改進和jQuery UI的加入
ASP.Net MVC3預設的專案模板已自動升級並加入 jQuery 1.4.4 和 jQuery Validation1.7。
我們非常高興地宣佈:我們今後將把jQuery UI加入到我們的預設 ASP.NET 專案模板中。jQuery UI提供了一套強大的UI 表單相關的額外部件和功能。 在你建立新的ASP.NET MVC3專案的時候,它將被預設添加到你的專案的 \scripts 資料夾下。
改進的視圖基架
"新增 View 對話盒" 的推導 View 所使用的 T4 模板現在用 Html.EditorFor 生成 View,而不是用Html.TextBoxFor類別的輔助函數。這個變更讓你能有選擇地用詮釋資料標註模型 (Annotation Model with Metadata) (使用資料標註特徵項),從而更好地制訂執行時UI的輸出。
新增 View 推導功能現在也支援強化的探測方法以及在模型上使用主鍵資訊 (包括支援命名規範,如ID, ProductID等等)。 比如: 新增 View 對話盒使用這個訊息來保證主鍵值不會是像可編輯表單欄位一樣,也保證了 View 之間的連結和主鍵訊息一塊被正確的自動生成。
預設的編輯和生成模板現在也包含對客戶端驗證所需的 jQuery 腳本的引用。推導表單 View 現在預設支援客戶端驗證(無需額外的步驟)。ASP.NET MVC3 的客戶端驗證通過一個隱藏的 javascript 方法來實作——讓頁面載入更快,也更乾淨。
[Controller Sessionstate]->[Session State]
ASP.Net MVC3 對 Session 需求更少的 Controller 增加了相應的支援。在最初的RC中,你要使用一個[ControllerSessionState]屬性來定義它。在RC2中,我們把它簡化成[SessionState]:
注意除了關閉 Session 狀態,你還能將它設置成唯讀(對你只需要讀取而不需要更改 Session 狀態的特殊請求的 Web Farm 場景很有用)
[SkipRequestValidation] –> [AllowHtml]
ASP.NET MVC內建了防止HTML和跨站腳本注入攻擊 (XSS) 的支援。當有人試圖輸入HTML內容進行提交的時候,它會拋出一個錯誤。要啟動它的話,程式設計師需要明確地指示這是被允許的(但願他們已經在自己的應用程式中安全地支援它)。
ASP.NET MVC3現在支持一個新屬性,你能將它應用到模型/檢視模型的屬性上,表明HTML輸入是開啟的。這讓我們能遵循DRY(Don't Repeat Yourself,特指在程序設計中避免重複程式碼)的方式獲得更精確的保護。在上個月的RC版本中,這個屬性被命名為 [SkipRequestValidation]。為了讓它更直覺,在RC2中,我們重命名為[AllowHtml]:
在模型/檢視模型中設置上面的[AllowHtml]屬性會使ASP.NET MVC3在模型只在繫結到那個屬性時關閉HTML注入防護。
Html.Raw()輔助方法
ASP.Net MVC3中引入的新Razor繪製引擎,自動預設HTML 編碼輸出。 這為我們防止HTML和腳本注入攻擊提供了新一層的防護。
我們在RC2中加入了Htmal.Raw()輔助方法,讓你能明確的指明你不想HTML編碼輸出,而是希望將內容呈現為「當作-是(as-is)」
檢視模式/檢視->檢視封裝
ASP.NET MVC(自V1起)就支持一個帶控制器和視圖的ViewData[]字典,讓程式設計師可以用一種後期繫結的方式從控制器往視圖傳值。這種方法能用來替代強型別模型類或與之一起使用。下面的程式碼Demo一個常見的例子——一個強型別Product模型通過ViewData[]字典傳給視圖和兩個後期繫結的變數:
在ASP.NET MVC3中,我們引入一個新API,它利用.NET 4中的動態型別支援來設置、傳回這些值。它允許你使用標準的「句點」符號來制定需要傳輸的任何數量的額外變數,而且不需要你定義一個強式類別來實現。
在早前的ASP.NET MVC3的預覽版中,我們透過控制器基底類別中命名為「ViewModel」的動態屬性和檢視模板中的「View」屬性來顯露這個API。 很多人發現這兩個不同的名字容易混淆,有些人還說在這個地方使用ViewModel這個名字讓人容易混淆——因為你常常在ASP.NET MVC中會建立強型別檢視模型(ViewModel)類別,而不會不使用這個API。
在RC2中我們在控制器和檢視中都顯露了一個同名的動態屬性——ViewBag。它是一個動態集合,允許你從控制器傳入額外的資料到你的檢視模板來幫助生成回應。 下面是一個範例,用來說明我們如何使用它傳輸一個時間戳訊息和一列目錄到我們的檢視模板:
下面的範例,展示我們的檢視模板(強型別,期望傳回一個Product類別做為它的Model)如何使用我們往 Viewbag 中傳入的訊息來生成回應。特別的是,注意我們是如何使用傳入動態 Viewbag 集合的一列目錄來幫助我們設置 Product 物件的 CategoryID 屬性的。
上面的控制器/檢視繫結然後會生成一個HTML response,如下。
輸出快取改進
在宣告控制器動作方法的[OutputCache]屬性的時候,ASP.NET MVC 3的輸出快取系統不再要求你指定 VaryByParam 屬性。 在你的動作方法有明確參數的時候,MVC3 現在能自動更改輸出快取項——這允許你用下面這樣的程式碼乾淨地實現操作時的快取輸出:
除了支持全頁輸出快取,ASP.NET MVC3 還支持部分頁快取——這允許你快取局部的輸出,並在不同的請求和控制器之間重覆使用。 RC2中改進了針對部分頁快取的[OutputCache]行為,使次要內容快取項根據輸入參數的不同而變化,而不是相對於頂層請求的URL結構而改變——這使快取場合比之前的RC版本更加容易而且強大。
@model宣告不加空格
在之前的預覽版本中,在頂層的Razor View 定義強型別@model 會在生成的 HTML 輸出中增加一個空白行。 這個問題已經被修復,宣告不會再加空格。
更改「Html.ValidationMessage」方法以顯示第一條有用的錯誤訊息
為了顯示首個有用錯誤訊息,而不是簡單地顯示第一個錯誤,Html.ValidationMessage() 輔助函數的行為進行了更改。
在模型繫結中,ModelState 字典能加入各種關於屬性錯誤訊息的程式碼,包括來自模型本身(如果實現了IValidateableObject),來自套用到該屬性的驗證特徵項,以及來自存取屬性時拋出的例外。
當Html.ValidataionMessage()方法顯示一個驗證訊息,它會跳過包含例外的 ModelState 入口,因為這些大多數都是不開放給終端用戶的。相反的,方法搜尋第一個沒有例外的驗證錯誤,然後顯示相關訊息。如果沒有找到這樣的訊息,它將預設顯示與第一個例外相關的錯誤訊息。
RemoteAttribute 「Fields」-> 「AdditionalFields」
ASP.NET MVC3內建遠端驗證支援及其驗證架構。這表示ASP.NET MVC3使用的客戶端驗證腳本庫能自動回呼你在伺服端顯露的 Controller,在用戶編輯表單的時候能用來決定一個輸入資訊是否真實有效(允許你提供實際驗證更新)。
要實現遠端驗證,你可以對模型/檢視模型屬性使用[Remote]屬性,標明遠端驗證的時候必須被叫用的控制器與動作。在RC中這個特徵項有個「Fields」的屬性,我們可以用來指定必須從客戶端傳到服務端的新增的輸入元素,從而實現驗證邏輯。為更清晰地表明這個屬性的用處,在今天的RC2發佈中我們將其重新命名為「AdditionalFields」。
ViewResult.Model和ViewResult.ViewBag屬性
現在ViewResult類別在類別外顯露「Model」和「ViewBag」屬性。這樣你可以更簡單地對傳回 View 的 Controller 進行單元測試,不需要通過 ViewResult.ViewData.Model 屬性存取模型。
安裝注意事項
你能從這裡下載和安裝ASP.NET MVC3 RC2, 它能裝於之前的ASP.NET MVC3 RC版本之上(安裝僅替代原先的內容)。
上面的安裝將不會變更的一個元件(如果你已經安裝了的話)是NuGet Package Manager。如果你已經安裝NuGet,請打開Visual Studio Extension Manager (通過工具->擴充選單項目),按「更新」。你會看到NuGet列在那裡——請點按它旁邊的「更新」按鈕, 將VS的擴充功能升級到今天的版本。
如果你沒有安裝NuGet(沒有安裝ASP.NET MVC RC版本),NuGet將被作為ASP.NET MVC3的一部分安裝,你無須再做任何額外操作。
總結
我們真的離ASP.NET MVC3的最終版發佈非常接近了。我們將於下個月發佈最終的」RTM」版本。距離ASP.NET MVC2推出才剛過7個月,團隊就能在這個版本中增加這麼多的新功能和新改進(Razor,隱藏的JavaScript,NuGet,依賴注射,輸出快取,以及更多更多),我覺得非常驚訝。 我將在接下來的幾周寫幾篇文章更深層地介紹他們。
希望對您有所幫助。
附:除了寫部落格之外,我還使用Twitter做快速更新並分享連結。請關注我:twitter.com/scottgu