mvc1,mvc2,mvc3都有什么區(qū)別
mvc1 模式:
view接收用戶輸入,把命令傳到controller
controller處理命令,更新model
model被更新后,會(huì)通知view需要update
view更新后向用戶顯示
mvc2 模式:
由于mvc1中,model可以通知view,然后view就可以被更新,這在windows程序中很常見,像MFC的frame-document-view架構(gòu),如果document改變了,他會(huì)主動(dòng)通知view進(jìn)行update
但是在web中,作為model的java bean更新后,無法調(diào)用作為view的jsp(而且view通常很多,需要選一個(gè)),因此改為mvc2模式:
view接收用戶輸入,把命令傳到controller
controller處理命令,更新model
model被更新后,controller會(huì)選一個(gè)view并forward到這個(gè)jsp,附帶把model放到request參數(shù)
這個(gè)view獲得model然后顯示
ASP.NET MVC 3 新特性全解析
ASP.NET MVC3 在 ASP.NET MVC 1 和 2 的基礎(chǔ)上,增加了大量的特性,使得代碼更加簡化,并且可以深度擴(kuò)展。這篇文章提供包含在此次發(fā)布中的許多新特性的說明.
Razor 視圖引擎
ASP.NET MVC3 帶來了一種新的名為 Razor 的視圖引擎,提供了下列優(yōu)點(diǎn):
Razor 現(xiàn)在提供了一些新的特征:
Razor 還包含新的 HTML Helper,例如:
支持多視圖引擎
在 ASP.NET MVC3 中,增加視圖的對話框中允許你選擇你希望的視圖引擎,在新建項(xiàng)目對話框中,你可以指定項(xiàng)目默認(rèn)的視圖引擎,可以選擇 WebForm,Razor,或者開源的視圖引擎,例如:Spark, NHaml, 或者 NDjango.
控制器的改進(jìn)
全局的 Action 過濾器
有的時(shí)候你希望能夠在在一個(gè) Action 方法執(zhí)行之前或者執(zhí)行之后執(zhí)行一些處理邏輯,在 ASP.NET MVC2 中,提供了 Action 過濾器,允許對特定控制器的 Action 方法進(jìn)行處理,實(shí)際上,有時(shí)候你希望對所有的 Action 都進(jìn)行類似的處理,MVC3 允許你將過濾器加入到 GlobalFilters 集合中來創(chuàng)建全局的過濾器.
新的 ViewBag 屬性
MVC2 中的控制器支持 ViewData 屬性,允許通過后綁定的字典將數(shù)據(jù)傳送給視圖模板,在 MVC3 中,你可以通過 ViewBag 來更加簡單的完成。例如,對于 ViewData["Message"] = "text",你可以通過 ViewBag.Message = "text" 來完成。你不需要通過類來定義任何強(qiáng)類型的屬性,因?yàn)檫@是動(dòng)態(tài)屬性,在內(nèi)部,ViewBag 屬性以名-值對的形式保存在 ViewData 字典中。注意,在許多預(yù)發(fā)布版本中,這個(gè)屬性被稱為 ViewModel。
新的 ActionResult 類型
下面的 ActionResult 類型在 MVC3 中是新增的或者被擴(kuò)展的。
JavaScript 和 Ajax 改進(jìn)
默認(rèn)情況下,在 MVC3 中,Ajax 和驗(yàn)證使用不引人注目的 unobtrusive 的 JavaScript 方式。unobtrusive 不會(huì)在 HTML 中插入行內(nèi)的 JavaScript ,這使得 HTML 更加精簡和更少干擾,也使得更加容易被替換和定制 JavaScript 庫,在 MVC3 中,驗(yàn)證助手默認(rèn)使用 jQuery.Validate 插件完成,如果你希望使用 MVC2 的行為,你可以在 web.config 中通過配置來關(guān)閉 unobtrusive .
默認(rèn)啟用了客戶端驗(yàn)證
在早先版本的 MVC 中,你需要在視圖中顯式調(diào)用 Html.EnableClientValidation 方法來啟用客戶端驗(yàn)證。在 MVC3 中,已經(jīng)不再需要了,因?yàn)槟J(rèn)就會(huì)啟用客戶端驗(yàn)證??梢栽?web.config 中關(guān)閉。
為了使得客戶端驗(yàn)證工作,你仍然需要在網(wǎng)站中加入對 jQuery 和 jQuery.Validation 庫的引用,你可以在自己的網(wǎng)站中提供,或者使用 Microsoft 或者 Google 的 CDN 服務(wù)器。
遠(yuǎn)程驗(yàn)證
ASP.NET 3 通過一個(gè)新的標(biāo)簽 RemoteAttribute 對 jQuery Validation 插件的遠(yuǎn)程驗(yàn)證提供支持。這允許客戶端的驗(yàn)證庫自動(dòng)調(diào)用一個(gè)你定義在服務(wù)器上的自定義的方法來完成只能在服務(wù)器上完成的驗(yàn)證邏輯。
在下面的例子中,Remote 標(biāo)簽指定了通過一個(gè)定義在 UsersController 中名為 UserNameAvailable 的方法來驗(yàn)證用戶名字段。
Razor 的語法簡單且清晰,只需要最小化的輸入
Razor 容易學(xué)習(xí),語法類似于 C# 和 VB
Visual Studio 對于 Razor 提供了智能提示和語法著色
Razor 視圖不需要允許程序或者啟動(dòng) Web 服務(wù)器就可以進(jìn)行測試
@model 用來指定傳到視圖的 Model 類型
@* * 注釋語法
對于整個(gè)站點(diǎn)可以一次性設(shè)定默認(rèn)項(xiàng)目,例如布局。
Html.Raw 方法提供了沒有進(jìn)行 HTML 編碼的輸出
支持在多個(gè)視圖之間共享代碼 ( _viewstart.cshtml 或者 _viewstart.vbhtml )
Chart. 生成圖表
WebGrid, 生成數(shù)據(jù)表格,支持完整的分頁和排序
Crypto,使用 Hash 算法來創(chuàng)建 Hash 和加鹽的口令
WebImage, 生成圖片
WebMail, 發(fā)送電子郵件
HttpNotFoundResult. 向客戶端返回 404 HTTP 狀態(tài).
RedirectResult. 基于一個(gè)布爾型的參數(shù),返回一個(gè)臨時(shí)的重定向 (HTTP 302 status code) 或者持久的重定向 (HTTP 301 status code), 結(jié)合這個(gè)改進(jìn),, Controller 提供了三個(gè)方法來支持持久的重定向: RedirectPermanent, RedirectToRoutePermanent, 和 RedirectToActionPermanent. 這些方法返回一個(gè) Permanent 屬性為真的 RedirectResult 對象實(shí)例。
HttpStatusCodeResult. 返回用戶指定的 HTTP 狀態(tài)碼。
- 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";
- }
- }
關(guān)于 Remote 屬性的更多資源,參考 How to: Implement Remote Validation in ASP.NET MVC http://msdn.microsoft.com/en-us/library/gg508808(VS.98).aspx
JSON 綁定支持
ASP.NET MVC3 包含內(nèi)置的 JSON 綁定支持,允許 Action 方法接收 JSON 編碼的數(shù)據(jù)并且模型化為 Action 的參數(shù)。這個(gè)能力經(jīng)常被用于客戶端的模板和數(shù)據(jù)綁定中。客戶端模板允許你通過客戶端的模板來格式化和顯示一個(gè)或者多個(gè)數(shù)據(jù),MVC3 允許你簡單的連接客戶端模板和服務(wù)器端的 Action 方法,通過 JSON 來發(fā)送和接收數(shù)據(jù),更多的信息參考:Scott Guthrie's MVC 3 Preview blog post.
ValidationAttribute 類
在 .NET Framework4 中被改進(jìn) 的ValidationAttribute 類支持新的 IsValid 重載,提供關(guān)于當(dāng)前驗(yàn)證上下文的更多信息,例如什么對象被驗(yàn)證了。這允許你基于 Model 的其他屬性來驗(yàn)證當(dāng)前值,例如,新的 CompareAttribute 就允許你比較 Model 的兩個(gè)屬性的值,在下面的例子中,ComparePassword 屬性必須匹配 Password 字段來同通過驗(yàn)證。
Model 驗(yàn)證的改進(jìn)
DataAnnotations 元數(shù)據(jù)標(biāo)簽
ASP.NET MVC3 支持 DataAnnotations 元數(shù)據(jù)標(biāo)簽,例如:DisplayAttribute。
- public class User
- {
- [Required]
- public string Password { get; set; }
- [Required, Compare("Password")]
- public string ComparePassword { get; set; }
- }
驗(yàn)證接口
IValidatableObject 接口允許執(zhí)行 Model 水平的驗(yàn)證,并且允許你提供整個(gè)模型狀態(tài)的驗(yàn)證錯(cuò)誤信息,或者基于 Model 的兩個(gè)屬性。當(dāng) Model 綁定的時(shí)候,MVC3 從 IValidatableObject 接收錯(cuò)誤信息,在視圖中使用內(nèi)建的 HTML 助手時(shí),將會(huì)自動(dòng)標(biāo)識(shí)或者高亮受影響的字段。
IClientValidatable 接口允許 ASP.NET MVC 在運(yùn)行時(shí)發(fā)現(xiàn)支持的客戶端驗(yàn)證器,這個(gè)接口被用來支持集成不同的驗(yàn)證框架。
更加關(guān)于驗(yàn)證接口的內(nèi)容,參考 Scott Guthrie's MVC 3 Preview blog post 中 Model Validation Improvements 一節(jié)。
依賴注入Dependency Injection 的改進(jìn)
ASP.NET MVC3 提供了更好的 DI 和 IoC 支持,在下面的地方支持 DI:
MVC3 支持 Common Service Locator 庫和任何支持這個(gè)庫的 IServiceLocator 接口的 DI 容器。也支持新的容易集成到 DI 框架的 IDependencyResolver 接口。
其他新特性
NuGet 集成
ASP.NET MVC3 自動(dòng)安裝和啟用 NuGet ,NUGet 是免費(fèi)開源的一個(gè)包管理器,使得在你的項(xiàng)目中容易發(fā)現(xiàn),安裝,和使用 .NET 庫。它可以和所有的 Visual Studio 項(xiàng)目類型一起工作,包括 ASP.NET WebForm 和 MVC。
NuGet 允許開發(fā)者維護(hù)開源項(xiàng)目,例如,像 Moq 項(xiàng)目,NHibernate 等等,可以注冊它們到一個(gè)在線的網(wǎng)站中。
更多信息參考:NuGet documentation on the CodePlex site.
部分頁的輸出緩存
ASP.NET MVC 從版本1 開始支持整頁緩存,MVC3 還提供了部分頁緩存。這可以允許你容易地緩存輸出的一個(gè)區(qū)域或者片斷,更多地內(nèi)容參考 Scott Guthrie's blog post on the MVC 3 release candidate 中 Partial Page Output Caching 段落,還有 MVC 3 Release Notes 中 Child Action Output Caching 段落。
在請求驗(yàn)證中的粒度控制
ASP.NET MVC 內(nèi)建了請求驗(yàn)證機(jī)制來自動(dòng)幫助處理類似跨站攻擊和 HTML 注入等等。實(shí)際上,有時(shí)你希望能夠顯式關(guān)閉請求的驗(yàn)證,例如你希望允許用戶提交 HTML 內(nèi)容,例如在內(nèi)容管理系統(tǒng)中,現(xiàn)在你可以通過增加 AllowHtml 標(biāo)簽到 Model 或者視圖的 Model 來支持在綁定的時(shí)候基于一個(gè)屬性關(guān)閉請求驗(yàn)證。更多地資料參考:
可擴(kuò)展的新建項(xiàng)目對話框
在 MVC3 中,你可以增加項(xiàng)目模板,視圖引擎,單元測試項(xiàng)目框架到新建項(xiàng)目對話框中。
腳手架的改進(jìn)
MVC3 中的腳手架對于主鍵提供了更好的支持,例如,腳手架的模板不會(huì)將主鍵加入的編輯表單中了。
默認(rèn)情況下,創(chuàng)建和編輯的腳手架現(xiàn)在使用 Html.EditorFor 助手來替代 Html.TextBoxFor 助手,這個(gè)改進(jìn)在增加視圖對話框生成一個(gè)視圖的時(shí)候,支持模型中的元數(shù)據(jù)標(biāo)簽。
對于 Html.LabelFor 和 Html.LabelForModel PDF的新重載
對于 LabelFor 和 LabelForModel 增加了新的方法重載,允許指定或者重寫 Label 文本。
無 Session 的控制器支持
MVC3 中可以指定控制器是否使用 Session 狀態(tài),進(jìn)而,Session 是否是讀寫還是只讀。
新的 AdditionalMetadataAttributePDF 類
可以通過 AdditionalMetadataAttribute 標(biāo)簽對 Model 的一個(gè)屬性訪問 ModelMetadata.AdditionalValues 字典,例如,如果模型的某個(gè)屬性僅僅支持管理員顯示,你可以如下設(shè)置:
控制器 (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 驗(yàn)證提供器 (registering and injecting).
Model 元數(shù)據(jù)提供器 (registering and injecting).
Value 提供器買賣IC網(wǎng) (registering and injecting).
Brad Wilson's series of blog posts on Service Location
MVC 3 Release Notes
Scott Guthrie's blog post on the MVC 3 release candidate 中 Unobtrusive JavaScript and Validation 一節(jié).
MVC 3 Release Notes