(包含 2011 年 4 月的工具更新)
ASP.NET MVC 3 是一個用來建立可擴展、標準化網頁應用程式的框架,結合成熟的設計模式以及 ASP.NET 和 .NET Framework 的強大功能。
它可以與 ASP.NET MVC 2 並排安裝,因此立即開始使用吧!
主要特色
- 整合式支架系統可透過 NuGet 擴充
- 支援 HTML 5 的專案範本
- 表現力豐富的視圖,包括全新的 Razor View 引擎
- 強大的掛鉤,具備依賴注入與全域動作過濾器
- 豐富的 JavaScript 支援,包含不顯眼的 JavaScript、jQuery 驗證與 JSON 綁定
- 請閱讀以下完整功能列表
熱門連結
ASP.NET MVC 3 有哪些新功能
- Phil Haack: ASP.NET MVC 3 發布
- Scott Hanselman: ASP.NET MVC3、WebMatrix、NuGet、IIS Express 與 Orchard 發布——Microsoft 1 月 Web 發行版內容背景
- Scott Guthrie: 宣布 ASP.NET MVC 3、IIS Express、SQL CE 4、Web Farm Framework、Orchard、WebMatrix 的發佈
- MVC 3 ASP.NET 發行說明
安裝與協助
- 建議使用 Web Platform Installer 安裝 ASP.NET MVC 3
- 使用 installer 執行檔安裝 ASP.NET MVC 3
- 安裝 ASP.NET MVC 3 for Visual Studio 11 開發者預覽版
- 閱讀 MVC 3 ASP.NET 入門教學
- 在論壇尋求幫助並討論 ASP.NET MVC 3。
ASP.NET MVC 3 概述
ASP.NET MVC 3 建立在 MVC 1 和 2 ASP.NET 基礎上,加入了許多優秀功能,既簡化了程式碼,也允許更深層的擴充性。 本主題概述本版本中包含的多項新功能,並依以下章節組織:
- 具備 MvcScaffold 整合的可擴充支架
- 支援 HTML 5 的專案範本
- Razor View 引擎
- 支援多視圖引擎
- 控制器改進
- JavaScript 與 Ajax
- 模型驗證改進
- 依賴注入改進
- 其他新功能
具備 MvcScaffold 整合的可擴充支架
新的 Scaffolding 系統讓你對框架完全陌生的人更容易上手並開始有效使用;如果你有經驗且已經知道自己在做什麼,也能自動化常見的開發任務。
此功能由新的 NuGet Scaffolding 套件 MvcScaffolding 支援。 「支架」一詞被許多軟體技術用來指「快速產生軟體的基本大綱,然後你可以編輯和自訂」。 我們為 ASP.NET MVC 打造的支架套件在多種情境下都非常有益:
- 如果你是第一次學習 ASP.NET MVC 的話,因為它能快速取得實用且可執行的程式碼,你可以根據需求進行編輯和調整。 它能幫你避免看到空白頁卻不知道從哪裡開始的創傷!
- 如果你對 MVC ASP.NET 很熟悉,現在正在探索一些新的附加技術 ,例如物件關聯映射器、檢視引擎、測試函式庫等等,因為該技術的創作者可能也為它打造了一個支架套件。
- 如果你的工作需要反覆建立類似的類別或檔案,因為你可以建立自訂支架來輸出測試夾具、部署腳本或其他你需要的東西。 你團隊的每個人都可以使用你自訂的腳手架架。
MvcScaffolding 的其他功能包括:
- 支援 C# 與 VB 專案
- 支援 Razor 與 ASPX 視圖引擎
- 支援 ASP.NET MVC 區域的支架,並使用自訂視圖佈局/主控
- 你可以輕鬆編輯 T4 範本來自訂輸出
- 你可以用自訂的 PowerShell 邏輯和自訂的 T4 範本,新增全新的支架。 這些(以及你設定的任何自訂參數)會自動出現在主機分頁的完成清單中。
- 你可以取得包含不同技術額外支架的 NuGet 套件(例如現在有用於 LINQ 轉 SQL 的概念驗證的套件),然後將它們混合並搭配使用。
ASP.NET MVC 3 工具更新包含 Visual Studio 對樣板系統的優秀支援,例如:
- 新增控制器對話框現在支援完全自動化的建立、讀取、更新與刪除控制器動作及相應檢視的樣板。 預設情況下,此架構以 EF Code First 來架構資料存取碼。
- 新增控制器對話框支援透過 NuGet 套件(如 MvcScaffolding)提供可擴展的腳手架。 這讓你能在對話框中插入自訂支架,這樣你就能為其他資料存取技術(如 NHibernate 或 JET)建立支架,如果你願意的話,也可以用 ODBCDirect 來做。
欲了解更多關於在ASP.NET MVC 3 中的腳手架資訊,請參閱以下資源:
史蒂夫·桑德森的文章系列,包括:
Scott Hanselman 在他 2010 年於 PDC 會議「與 Microsoft 建立部落格」「無名的網路之愛套件」中的文章
HTML 5 專案範本
新專案對話框包含「啟用專案範本 HTML 5 版本」的勾選框。 這些範本利用 Modernizr 1.7,在低階瀏覽器中支援 HTML 5 與 CSS 3。
Razor View 引擎
ASP.NET MVC 3 配備了名為 Razor 的新視圖引擎,提供以下優點:
- Razor 語法簡潔且精練,只需最少的按鍵次數。
- Razor 很容易學,部分原因是它基於現有語言如 C# 和 Visual Basic。
- Visual Studio 包含 IntelliSense 及 Razor 語法的程式碼著色功能。
- Razor 視圖可以進行單元測試,無需執行應用程式或啟動網頁伺服器。
Razor 的一些新功能包括以下幾項:
-
@model指定傳遞至視圖型別的語法。 -
@* *@註解語法。 - 能夠為整個網站指定一次預設值(例如
layoutpage)。 -
Html.Raw顯示文字的方法,而不使用 HTML 編碼。 - 支援多個視圖間的程式碼共享(_viewstart.cshtml 或 _viewstart.vbhtml 檔案)。
Razor 也新增了 HTML 輔助工具,例如以下幾款:
-
Chart。 會呈現圖表,提供與 ASP.NET 4中圖表控制相同的功能。 -
WebGrid。 呈現資料網格,具備分頁與排序功能。 -
Crypto。 使用雜湊演算法來建立適當加鹽並雜湊的密碼。 -
WebImage。 渲染影像。 -
WebMail。 傳送電子郵件訊息。
欲了解更多關於 Razor 的資訊,請參閱以下資源:
- Scott Guthrie 介紹 Razor 的部落格文章
- Scott Guthrie's blog post introducing the @model keyword
- Scott Guthrie 部落格文章介紹 Razor 布局
- Razor API 快速參考
- MVC 3 發行說明
支援多視圖引擎
ASP.NET MVC 3 中的 新增檢視 對話框讓你選擇想要使用的檢視引擎, 而新專案 對話框則讓你指定專案的預設檢視引擎。 你可以選擇 Web Forms 檢視引擎(ASPX)、Razor,或是開源檢視引擎如 Spark、 NHaml 或 NDjango。
控制器改進
全域動作過濾器
有時候你會想在動作方法執行前或動作方法執行後執行邏輯。 為了支持這一點,ASP.NET MVC 2 提供了動作過濾器。 動作過濾器是自訂屬性,提供宣告式的方式,將動作前與動作後行為加入特定的控制器動作方法。 不過,在某些情況下,你可能想指定適用於所有動作方法的前置或後處理行為。 MVC 3 允許你透過將全域過濾器加入 GlobalFilters 集合來指定它們。 欲了解更多關於全域動作過濾器的資訊,請參閱以下資源:
全新「ViewBag」屬性
MVC 2 控制器支援一個 ViewData 特性,允許你使用延遲綁定字典 API 將資料傳送到檢視範本。 在 MVC 3 中,你也可以使用較簡單的語法來 ViewBag 達成相同目的。 例如,你可以寫ViewBag.Message="text",而不是寫ViewData["Message"]="text"。 您不需定義任何強類型類別來使用此 ViewBag 屬性。 因為它是動態屬性,你可以直接取得或設定屬性,執行時它會動態解析它們。 在內部, ViewBag 屬性以名稱/值對的形式儲存在 ViewData 字典中。 (註:在大多數 MVC 3 預發布版本中,該 ViewBag 屬性被命名為 the ViewModel property。)
新的「動作結果」類型
MVC 3 新增或增強了以下 ActionResult 類型及相應的輔助方法:
- HttpNotFoundResult。 會回傳一個 404 HTTP 狀態碼給用戶端。
-
RedirectResult。 會回傳一個暫時的重定向(HTTP 302 狀態碼)或永久重定向(HTTP 301 狀態碼),視布林參數而定。 配合此變更,控制器類別現在有三種執行永久重定向的方法:
RedirectPermanent、、RedirectToRoutePermanentRedirectToActionPermanent和 。 這些方法會返回RedirectResult的實例,並將其屬性Permanent設定為true。 - HttpStatusCodeResult。 回傳使用者指定的 HTTP 狀態碼。
JavaScript 與 Ajax 改進
預設情況下,Ajax 與 MVC 3 中的驗證助手採用不干擾的 JavaScript 方法。 不干擾式 JavaScript 避免將內嵌 JavaScript 注入 HTML 中。 這會讓你的 HTML 變得更小、更不雜亂,也更容易更換或自訂 JavaScript 函式庫。 MVC 3 中的驗證輔助工具預設也會使用這個 jQueryValidate 外掛。 如果你想要 MVC 2 的行為,可以用 web.config 檔案設定停用不干擾的 JavaScript。 欲了解更多關於 JavaScript 與 Ajax 改進的資訊,請參閱以下資源:
- 維基百科網站上不顯眼的 JavaScript 基本介紹
- Brad Wilson 不顯眼的 JavaScript 貼文
- Brad Wilson 不顯眼的 JavaScript 驗證貼文
- 使用 Razor 與 Unobrusive JavaScript 建立 MVC 3 應用程式 (ASP.NET 網站教學)
- MVC 3 發行說明
默認啟用的客戶端驗證
在較早期的 MVC 版本中,你需要從視圖明確呼叫該 Html.EnableClientValidation 方法,才能啟用用戶端驗證。 在 MVC 3 中,因為預設啟用用戶端驗證,因此不再需要此功能。 (你可以用 web.config 檔案中的設定來關閉這個功能。)
為了讓客戶端驗證正常運作,你仍然需要在網站上參考適當的 jQuery 和 jQuery 驗證函式庫。 你可以把這些函式庫架設在自己的伺服器上,或是從像 Microsoft 或 Google 的 CDN 這類內容傳遞網路(CDN)中參考。
遠端驗證器
ASP.NET MVC 3 支援新的 RemoteAttribute 類別,讓你能利用 jQuery Validation 外掛的遠端驗證器支援。 這使得客戶端驗證函式庫能自動呼叫你在伺服器端定義的自訂方法,執行只能在伺服器端完成的驗證邏輯。
在以下範例中,屬性Remote指定客戶端驗證會呼叫類別上UserNameAvailable命名UsersController的動作以驗證該UserName欄位。
public class User
{
[Remote("UserNameAvailable", "Users")]
public string UserName { get; set; }
}
以下範例顯示對應的控制器。
public class UsersController
{
public bool UserNameAvailable(string username)
{
if(MyRepository.UserNameExists(username))
{
return "false";
}
return "true";
}
}
欲了解如何使用Remote屬性,請參閱 MSDN 函式庫中的「如何:在 ASP.NET MVC 中實作遠端驗證」。
JSON 綁定支援
ASP.NET MVC 3 內建 JSON 綁定支援,使動作方法能接收 JSON 編碼資料並將其模型綁定到動作方法參數。 此功能在涉及用戶端範本與資料綁定的情境中非常有用。 (用戶端範本允許您使用在用戶端執行的範本,格式化並顯示單一資料項目或一組資料項目。)MVC 3 讓你能輕鬆將客戶端範本與伺服器上的動作方法連結,這些方法能傳送和接收 JSON 資料。 欲了解更多關於 JSON 綁定支援的資訊,請參閱 Scott Guthrie 的 MVC 3 預覽部落格文章中關於 JavaScript 與 AJAX 改進的章節。
模型驗證改進
「DataAnnotations」元資料屬性
ASP.NET MVC 3 支援 DataAnnotations 類型的中繼資料屬性,例如 DisplayAttribute。
「ValidationAttribute」類別
該 ValidationAttribute 類別在 .NET Framework 4 中被改進,以支援新的 IsValid 超載,提供更多關於當前驗證上下文的資訊,例如正在驗證的物件。 這讓更多情境能讓你根據模型的其他特性驗證當前值。 例如,新 CompareAttribute 屬性允許你比較模型兩個屬性的值。 以下範例中, ComparePassword 該性質必須與欄位相符 Password 才有效。
public class User
{
[Required]
public string Password { get; set; }
[Required, Compare("Password")]
public string ComparePassword { get; set; }
}
驗證介面
IValidatableObject 介面允許您執行模型層級的驗證,並能提供針對整體模型狀態或模型內兩個屬性間特定驗證錯誤訊息。 MVC 3 現在在模型綁定時會從介面中檢索錯誤 IValidatableObject ,並利用內建的 HTML 表單輔助工具自動標記或高亮檢視中受影響的欄位。
IClientValidatable 介面讓 ASP.NET MVC 能在執行時發現驗證者是否支援用戶端驗證。 此介面設計可與多種驗證框架整合。
欲了解更多驗證介面相關資訊,請參閱 Scott Guthrie 的 MVC 3 預覽部落格文章中的模型驗證改進部分。 (不過請注意,部落格中對「IValidateObject」的引用應為「IValidatableObject」。)
依賴注入改進
ASP.NET MVC 3 提供了更好的支援,用於應用相依注入(DI)以及與相依注入或控制反轉(IOC)容器的整合。 以下領域新增了對DI的支援:
- 控制器(註冊並注入控制器工廠,注入控制器)。
- 檢視(註冊與注入檢視引擎,將相依性注入檢視頁)。
- 動作過濾器(定位並注入過濾器)。
- 模型繫結器(註冊與注入)。
- 模型驗證提供者(註冊與注入)。
- 建模元資料提供者(註冊與注入)。
- 價值提供者(註冊與注入)。
MVC 3 支援 通用服務定位 函式庫及任何支援該函式庫 IServiceLocator 介面的 DI 容器。 它也支援一個新的 IDependencyResolver 介面,讓整合 DI 框架變得更容易。
欲了解更多關於MVC 3中DI的資訊,請參閱以下資源:
其他新功能
NuGet 整合
ASP.NET MVC 3 會自動安裝並啟用 NuGet,作為設定的一部分。 NuGet 是一個免費的開源套件管理器,讓你輕鬆找到、安裝並使用 .NET 函式庫與工具。 它適用於所有 Visual Studio 專案類型(包括 ASP.NET Web 表單和 ASP.NET MVC)。
NuGet 讓維護開源專案的開發者(例如像 Moq、NHibernate、Ninject、StructureMap、NUnit、Windsor、RhinoMocks 和 Elmah)能夠打包他們的函式庫,並將其註冊到線上圖庫中。 因此,想使用這些函式庫的 .NET 開發者就能輕鬆找到該套件並安裝到他們正在進行的專案中。
隨著 ASP.NET 3 工具更新,專案範本包含預先安裝的 NuGet 套件中的 JavaScript 函式庫,因此可透過 NuGet 更新。 Entity Framework Code First 也已預裝為 NuGet 套件。
欲了解更多 NuGet 相關資訊,請參閱 NuGet 文件。
部分頁面輸出快取
ASP.NET MVC 自版本 1 起就支援整頁回應的輸出快取。 MVC 3 也支援部分頁面輸出快取,讓你能輕鬆快取回應的區域或片段。 欲了解更多快取相關資訊,請參閱 Scott Guthrie 部落格文章中關於 MVC 3 版本候選的部分頁面輸出快取部分,以及 MVC 3 發布說明中的子行動輸出快取部分。
對請求驗證的細緻控制
ASP.NET MVC 內建請求驗證功能,能自動協助防範 XSS 和 HTML 注入攻擊。 不過,有時你想明確關閉請求驗證,例如讓使用者發布 HTML 內容(例如部落格文章或 CMS 內容)。 你現在可以在模型或檢視模型中新增 AllowHtml 屬性,在模型綁定時依每個屬性關閉請求驗證。 欲了解更多關於請求驗證的資訊,請參閱以下資源:
- Scott Guthrie 部落格文章中關於 MVC 3 版本候選的「不顯眼的 JavaScript 與驗證」部分。
- MVC 3 發行說明
可擴充的「新專案」對話框
在 ASP.NET MVC 3 中,你可以將專案範本、檢視引擎和單元測試專案框架加入 新專案 對話框。
模板框架改進
ASP.NET MVC 3 支架範本在識別模型上的主鍵屬性並妥善處理,比早期版本的 MVC 更為出色。 (例如,支架模板現在確保主鍵不會被支架化為可編輯的表單欄位。)
預設情況下,建立與編輯支架現在使用 Html.EditorFor 輔助工具而非 Html.TextBoxFor 輔助工具。 這改善了在 新增檢視 對話框生成檢視時,對模型中元資料的資料註解屬性的支援。
「Html.LabelFor」和「Html.LabelForModel」的新重載
新增了新的方法過載用於LabelFor和LabelForModel輔助方法。 新的超載功能讓你能指定或覆蓋標籤文字。
無會話控制器支援
在 MVC 3 ASP.NET 中,你可以指定是否希望控制器類別使用 session 狀態,如果是的話,會話狀態應該是讀寫還是唯讀。 欲了解更多無會話控制器支援資訊,請參閱 MVC 3 版本說明。
新增的「AdditionalMetadataAttribute」類別
你可以使用 AdditionalMetadata 屬性來填充 ModelMetadata.AdditionalValues 字典中的模型屬性。 例如,如果一個檢視模型有一個屬性應該只顯示給管理員,你可以像以下範例所示標註該屬性:
public class ProductViewModel
{
[AdditionalMetadata("AdminOnly", true)]
public string RefundCode {get; set;}
}
當產品檢視模型被渲染時,這些元資料會提供給任何顯示或編輯器範本。 解讀這些元資料資訊由你負責。
AccountController 改進
網際網路專案範本中的 AccountController 已大幅改進。
新內聯網專案範本
內建一個新的內聯網專案範本,啟用 Windows 認證並移除 AccountController。