文章目錄
ASP.NET MVC 3.0(一): MVC 3.0 的新特性 摘要
ASP.NET MVC 3.0(二): MVC的概念及MVC 3.0開發環境
ASP.NET MVC 3.0(三): 初識MVC的Url映射潛規則Routing
ASP.NET MVC 3.0(四): 我要MVC潛規則之配置Routing
ASP.NET MVC 3.0(五): 入手Controller/Action
ASP.NET MVC 3.0(六): MVC 3.0建立你的View視圖
ASP.NET MVC 3.0(七): MVC 3.0 新的Razor引擎
ASP.NET MVC 3.0(八): MVC 3.0 傳遞和儲存你的Model
ASP.NET MVC 3.0(九): MVC 3.0 驗證你的Model
ASP.NET MVC 3.0(十): MVC 3.0 使用 Forms身分識別驗證
ASP.NET MVC 3.0(十一): MVC 3.0 使用篩選器
ASP.NET MVC 3.0(十二): MVC 3.0 使用自訂的Html控制項
ASP.NET MVC 3.0(十三): MVC 3.0 防止跨網站請求偽造 (CSRF) 攻擊
ASP.NET MVC 3.0(十四): MVC 3.0 執行個體系列之建立資料表格
ASP.NET MVC 3.0(十五): MVC 3.0 執行個體系列之表格的排序
ASP.NET MVC 3.0(十六): MVC 3.0 執行個體系列之表格式資料的分頁
ASP.NET MVC 3.0(十七): MVC 3.0 執行個體之表格中資料的篩選
ASP.NET MVC 3.0(十八): MVC 3.0 執行個體系列之表格中合并排序、分頁和篩選
ASP.NET MVC 3.0(十九): MVC 3.0 執行個體之使用開原始檔控制實現表格排序和分頁
摘要
MVC經過其1.0和2.0版本的發展,現在已經到了3.0的領軍時代,隨著技術的不斷改進,MVC也越來越成熟。使開發也變得簡潔人性化藝術化。
園子裡有很多大鳥都對MVC了如指掌,面對問題猶同孫悟空的七十二變一般遊刃有餘,令人羨慕。大鳥們的著作我們作為菜鳥看了又看,讀了又讀但是還是對MVC3.0的瞭解不是很深。
這種杯具的情況豈止是杯具呀,那簡直就是杯具。綜合分析後得出結論:眼高手低!!!
最後菜鳥痛定思過,決定從最基本的開始一步一步開始學習MVC 3.0 也希望想學習MVC3.0的小菜們分享一下下。。。。
前言
ASP.NET MVC3 在 ASP.NET MVC 1 和 2 的基礎上,增加了大量的特性,使得代碼更加簡化,並且可以深度擴充。這篇文章提供包含在此次發布中的許多新特性的說明,分為以下部分:
- Razor 視圖引擎
- 支援多視圖引擎
- Controller 改進
- JavaScript 和 Ajax
- Model 驗證的改進
- 依賴注入 Dependency Injection 的改進
- 其他新特性
Razor 視圖引擎
ASP.NET MVC3 帶來了一種新的名為 Razor 的視圖引擎,提供了下列優點:
- Razor 的文法簡單且清晰,只需要最小化的輸入
- Razor 容易學習,文法類似於 C# 和 VB
- Visual Studio 對於 Razor 提供了智能提示和文法著色
- Razor 視圖不需要允許程式或者啟動 Web 服務器就可以進行測試
Razor 現在提供了一些新的特徵:
- @model 用來指定傳到視圖的 Model 類型
- @* * 注釋文法
- 對於整個網站可以一次性設定預設項目,例如布局。
- Html.Raw 方法提供了沒有進行 HTML 編碼的輸出
- 支援在多個視圖之間共用代碼 ( _viewstart.cshtml 或者 _viewstart.vbhtml )
Razor 還包含新的 HTML Helper,例如:
- Chart. 組建圖表
- WebGrid, 產生資料表格,支援完整的分頁和排序
- Crypto,使用 Hash 演算法來建立 Hash 和加鹽的口令
- WebImage, 產生圖片
- WebMail, 寄送電子郵件
如下範例程式碼:
@model List<MvcMusicStore.Models.Album>
@{
ViewBag.Title = "ASP.NET MVC Music Store";
}
<div id="promotion">
</div>
<h3><em>Fresh</em> off the grill</h3>
<ul id="album-list">
@foreach (var album in Model)
{
<li><a href="@Url.Action("Details", "Store",
new { id = album.AlbumId })">
<img alt="@album.Title" src="@album.AlbumArtUrl"/>
<span>@album.Title</span></a>
</li>
}
</ul>
關於 Razor 更多的資料,可以參考下面的資源:
- Scott Guthrie's blog post introducing Razor
- Scott Guthrie's blog post introducing the @model keyword
- Scott Guthrie's blog post introducing Razor layouts
- Razor API Quick Reference
- MVC 3 Release Notes
支援多視圖引擎
在 ASP.NET MVC3 中,增加視圖的對話方塊中允許你選擇你希望的視圖引擎,在建立項目對話方塊中,你可以指定項目預設的視圖引擎,可以選擇 WebForm,Razor,或者開源的視圖引擎,例如:Spark, NHaml, 或者 NDjango.
選擇視圖引擎:
控制器的改進 全域的 Action 過濾器
有的時候你希望能夠在在一個 Action 方法執行之前或者執行之後執行一些處理邏輯,在 ASP.NET MVC2 中,提供了 Action 過濾器,允許對特定控制器的 Action 方法進行處理,實際上,有時候你希望對所有的 Action 都進行類似的處理,MVC3 允許你將過濾器加入到 GlobalFilters 集合中來建立全域的過濾器,詳細的介紹,參考下列資源:
- Scott Guthrie's blog on the MVC 3 Preview
- Filtering in ASP.NET MVC
新的 ViewBag 屬性
MVC2 中的控制器支援 ViewData 屬性,允許通過後綁定的字典將資料傳送給視圖模板,在 MVC3 中,你可以通過 ViewBag 來更加簡單的完成。例如,對於 ViewData["Message"] = "text",你可以通過 ViewBag.Message = "text" 來完成。你不需要通過類來定義任何強型別的屬性,因為這是動態屬性,在內部,ViewBag 屬性以名-值對的形式儲存在 ViewData 字典中。注意,在許多預發布版本中,這個屬性被稱為 ViewModel。
新的 ActionResult 類型
下面的 ActionResult 類型在 MVC3 中是新增的或者被擴充的。
- . 向用戶端返回 404 HTTP 狀態. HttpNotFoundResult
- . 基於一個布爾型的參數,返回一個臨時的重新導向 (HTTP 302 status code) 或者持久的重新導向 (HTTP 301 status code), 結合這個改進,, 提供了三個方法來支援持久的重新導向: , , 和 . 這些方法返回一個 屬性為真的 對象執行個體。 RedirectResultController
RedirectPermanent
RedirectToRoutePermanent
RedirectToActionPermanent
PermanentRedirectResult
- . 返回使用者指定的 HTTP 狀態代碼。 HttpStatusCodeResult
JavaScript 和 Ajax 改進
預設情況下,在 MVC3 中,Ajax 和驗證使用不令人信服的 unobtrusive 的 JavaScript 方式。unobtrusive 不會在 HTML 中插入行內的 JavaScript ,這使得 HTML 更加精簡和更少幹擾,也使得更加容易被替換和定製 JavaScript 庫,在 MVC3 中,驗證助手預設使用 jQuery.Validate 外掛程式完成,如果你希望使用 MVC2 的行為,你可以在 web.config 中通過配置來關閉 unobtrusive ,更多的資訊參考下列資源:
- Basic introduction to unobtrusive JavaScript on the Wikipedia site
- Brad Wilson's Unobtrusive JavaScript Post
- Brad Wilson's Unobtrusive JavaScript Validation Post
- (tutorial on the ASP.NET site) Creating a MVC 3 Application with Razor and Unobtrusive JavaScript
- MVC 3 Release Notes
預設啟用了用戶端驗證
在早先版本的 MVC 中,你需要在視圖中顯式調用 Html.EnableClientValidation 方法來啟用用戶端驗證。在 MVC3 中,已經不再需要了,因為預設就會啟用用戶端驗證。可以在 web.config 中關閉。
為了使得用戶端驗證工作,你仍然需要在網站中加入對 jQuery 和 jQuery.Validation 庫的引用,你可以在自己的網站中提供,或者使用 Microsoft 或者 Google 的 CDN 伺服器。
遠程驗證
ASP.NET 3 通過一個新的標籤 RemoteAttribute 對 jQuery Validation 外掛程式的遠程驗證提供支援。這允許用戶端的驗證庫自動調用一個你定義在伺服器上的自訂的方法來完成只能在伺服器上完成的驗證邏輯。
在下面的例子中,Remote 標籤指定了通過一個定義在 UsersController 中名為 UserNameAvailable 的方法來驗證使用者名稱欄位。
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 屬性的更多資源,參考 How to: Implement Remote Validation in ASP.NET MVC
JSON 綁定支援
ASP.NET MVC3 包含內建的 JSON 綁定支援,允許 Action 方法接收 JSON 編碼的資料並且模型化為 Action 的參數。這個能力經常被用於用戶端的模板和資料繫結中。用戶端模板允許你通過用戶端的模板來格式化和顯示一個或者多個資料,MVC3 允許你簡單的串連用戶端模板和伺服器端的 Action 方法,通過 JSON 來發送和接收資料,更多的資訊參考:Scott Guthrie's MVC 3 Preview blog post.
Model 驗證的改進DataAnnotations 中繼資料標籤
ASP.NET MVC3 支援 DataAnnotations 中繼資料標籤,例如:DisplayAttribute。
ValidationAttribute 類
在 .NET Framework4 中被改進 的ValidationAttribute 類支援新的 IsValid 重載,提供關於當前驗證內容相關的更多資訊,例如什麼對象被驗證了。這允許你基於 Model 的其他屬性來驗證當前值,例如,新的 CompareAttribute 就允許你比較 Model 的兩個屬性的值,在下面的例子中,ComparePassword 屬性必須匹配 Password 欄位來同通過驗證。
public class User
{
[Required]
public string Password { get; set; }
[Required, Compare("Password")]
public string ComparePassword { get; set; }
}
驗證介面
IValidatableObject 介面允許執行 Model 水平的驗證,並且允許你提供整個模型狀態的驗證錯誤資訊,或者基於 Model 的兩個屬性。當 Model 綁定的時候,MVC3 從 IValidatableObject 接收錯誤資訊,在視圖中使用內建的 HTML 助手時,將會自動標識或者高亮受影響的欄位。
IClientValidatable 介面允許 ASP.NET MVC 在運行時發現支援的用戶端驗證器,這個介面被用來支援整合不同的驗證架構。
更加關於驗證介面的內容,參考 Scott Guthrie's MVC 3 Preview blog post 中 Model Validation Improvements 一節。
依賴注入Dependency Injection 的改進
ASP.NET MVC3 提供了更好的 DI 和 IoC 支援,在下面的地方支援 DI:
- 控制器 (registering and injecting controller factories, injecting controllers).
- 視圖 (registering and injecting view engines, injecting dependencies into view pages).
- Action 過濾器 (locating and injecting filters).
- Model 綁定器 (registering and injecting).
- Model 驗證提供器 (registering and injecting).
- Model 中繼資料提供器 (registering and injecting).
- Value 提供器 (registering and injecting).
MVC3 支援 Common Service Locator 庫和任何支援這個庫的 IServiceLocator 介面的 DI 容器。也支援新的容易整合到 DI 架構的 IDependencyResolver 介面。
更多關於 DI 的資訊,參考:
- Brad Wilson's series of blog posts on Service Location
- MVC 3 Release Notes
其他新特性 NuGet 整合
ASP.NET MVC3 自動安裝和啟用 NuGet ,NUGet 是免費開源的一個包管理器,使得在你的項目中容易發現,安裝,和使用 .NET 庫。它可以和所有的 Visual Studio 項目類型一起工作,包括 ASP.NET WebForm 和 MVC。
NuGet 允許開發人員維護開源項目,例如,像 Moq 項目,NHibernate 等等,可以註冊它們到一個線上的網站中。
更多資訊參考:NuGet documentation on the CodePlex site.
部分頁的輸出緩衝
ASP.NET MVC 從版本1 開始支援整頁緩衝,MVC3 還提供了部分頁緩衝。這可以允許你容易地緩衝輸出的一個地區或者片斷,更多地內容參考 Scott Guthrie's blog post on the MVC 3 release candidate 中 Partial Page Output Caching 段落,還有 MVC 3 Release Notes 中 Child Action Output Caching 段落。
在請求驗證中的粒度控制
ASP.NET MVC 內建了請求驗證機制來自動協助處理類似跨站攻擊和 HTML 注入等等。實際上,有時你希望能夠顯式關閉請求的驗證,例如你希望允許使用者提交 HTML 內容,例如在內容管理系統中,現在你可以通過增加 AllowHtml 標籤到 Model 或者視圖的 Model 來支援在綁定的時候基於一個屬性關閉請求驗證。更多地資料參考:
- 中 一節. Scott Guthrie's blog post on the MVC 3 release candidateUnobtrusive JavaScript and Validation
- MVC 3 Release Notes
可擴充的建立項目對話方塊
在 MVC3 中,你可以增加項目模板,視圖引擎,單元測試項目架構到建立項目對話方塊中。
腳手架的改進
MVC3 中的腳手架對於主鍵提供了更好的支援,例如,腳手架的模板不會將主鍵加入的編輯表單中了。
預設情況下,建立和編輯的腳手架現在使用 Html.EditorFor 助手來替代 Html.TextBoxFor 助手,這個改進在增加視圖對話方塊產生一個視圖的時候,支援模型中的中繼資料標籤。
對於 Html.LabelFor 和 Html.LabelForModel 的新重載
對於 LabelFor 和 LabelForModel 增加了新的方法重載,允許指定或者重寫 Label 文本。
無 Session 的控制器支援
MVC3 中可以指定控制器是否使用 Session 狀態,進而,Session 是否是讀寫還是唯讀。
新的 AdditionalMetadataAttribute 類
可以通過 AdditionalMetadataAttribute 標籤對 Model 的一個屬性訪問 ModelMetadata.AdditionalValues 字典,例如,如果模型的某個屬性僅僅支援管理員顯示,你可以如下設定:
public class ProductViewModel
{
[AdditionalMetadata("AdminOnly", true)]
public string RefundCode {get; set;}
}
當使用產品的 Model 來產生的時候,這個中繼資料將被任何顯示或者編輯模板使用,這允許你來解釋中繼資料資訊。
原文出處:http://www.asp.net/mvc/mvc3