ASP.NET MVC 3

(包含 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 有哪些新功能

安裝與協助

ASP.NET MVC 3 概述

ASP.NET MVC 3 建立在 MVC 1 和 2 ASP.NET 基礎上,加入了許多優秀功能,既簡化了程式碼,也允許更深層的擴充性。 本主題概述本版本中包含的多項新功能,並依以下章節組織:

具備 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 中的腳手架資訊,請參閱以下資源:

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 的資訊,請參閱以下資源:

支援多視圖引擎

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 改進的資訊,請參閱以下資源:

默認啟用的客戶端驗證

在較早期的 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 屬性,在模型綁定時依每個屬性關閉請求驗證。 欲了解更多關於請求驗證的資訊,請參閱以下資源:

可擴充的「新專案」對話框

在 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。