有關(guān)ASP.NET MVC框架的一些基礎(chǔ)知識(shí)
MVC(模型—視圖—控制器)結(jié)構(gòu)模式把一個(gè)應(yīng)用程序拆分成三個(gè)主要組件:模型、視圖和控制器。在創(chuàng)建基于MVC框架的Web應(yīng)用程序時(shí),你可以把ASP.NET MVC框架作為ASP.NET Web表單模式方案的一種重要候選。較之于基于Web表單的應(yīng)用程序,ASP.NET MVC框架是一個(gè)輕量級(jí)的、測(cè)試性強(qiáng)的描述框架,它能夠與現(xiàn)有ASP.NET特征(例如母版頁(yè)面和基于成員身份的認(rèn)證)緊密集成。MVC框架定義于System.Web.Mvc命名空間中。
長(zhǎng)時(shí)間以來(lái),MVC是一種為眾多開(kāi)發(fā)人員所熟悉的標(biāo)準(zhǔn)設(shè)計(jì)模式。一些類型的Web應(yīng)用程序受益于MVC框架,而另一些將繼續(xù)使用基于Web表單與回寄技術(shù)的傳統(tǒng)型ASP.NET應(yīng)用程序模式,還有一些類型的Web應(yīng)用程序則有可能把這兩種模式結(jié)合到一起使用??傊?,MVC框架方案與Web表單方案并非相互排斥的。
總體來(lái)看,MVC框架包括下列組件:
(一)模型。模型對(duì)象是實(shí)現(xiàn)應(yīng)用程序數(shù)據(jù)域邏輯的部分。經(jīng)常情況下,模型對(duì)象還負(fù)責(zé)從數(shù)據(jù)庫(kù)中檢索和存儲(chǔ)模型狀態(tài)。例如,一個(gè)產(chǎn)品對(duì)象有可能從一個(gè)數(shù)據(jù)庫(kù)中檢索信息,操作其中的數(shù)據(jù),然后把更新信息寫(xiě)回SQL Server數(shù)據(jù)庫(kù)中的某一個(gè)產(chǎn)品表格內(nèi)。
【提示】在小型應(yīng)用程序中,模型經(jīng)常是一個(gè)概念上的分離而不是一個(gè)物理概念。例如,如果應(yīng)用程序僅讀取一個(gè)數(shù)據(jù)集并且要把它發(fā)送到視圖中,那么應(yīng)用程序就不必專門(mén)創(chuàng)建一個(gè)物理模型層和相關(guān)聯(lián)的類。在這種情況下,數(shù)據(jù)就直接承擔(dān)了一個(gè)模型對(duì)象的角色。
(二)視圖。視圖是負(fù)責(zé)顯示應(yīng)用程序的用戶接口(UI)的組件。典型情況下,這個(gè)UI是基于模型數(shù)據(jù)創(chuàng)建的。一個(gè)典型的示例就是一個(gè)產(chǎn)品表格的編輯視圖。在此視圖中,可以基于一個(gè)產(chǎn)品對(duì)象的當(dāng)前狀態(tài)顯示文本框、下拉列表框和復(fù)選框等控件。
(三)控制器。控制器組件的作用是負(fù)責(zé)處理用戶交互,操作模型,并且最終選擇一個(gè)要顯示UI的視圖并生成之。在一個(gè)MVC應(yīng)用程序中,視圖僅僅負(fù)責(zé)顯示信息,而由控制器負(fù)責(zé)處理和響應(yīng)用戶輸入與交互。例如,由控制器來(lái)處理查詢字符串值,并且把這些值傳遞到模型,然后在模型中使用該值進(jìn)行數(shù)據(jù)庫(kù)查詢。
MVC模式在幫助你把應(yīng)用程序的不同方面(輸入邏輯,業(yè)務(wù)邏輯和UI邏輯)分離開(kāi)來(lái)的同時(shí),提供了這些元素之間的松耦合。MVC模式要求每一種不同的邏輯應(yīng)該存在于應(yīng)用程序中的特定位置。例如,UI邏輯隸屬于視圖,而輸入邏輯隸屬于控制器,業(yè)務(wù)邏輯則隸屬于模型。這種分離有助于你在構(gòu)建一個(gè)應(yīng)用程序管理復(fù)雜性,因?yàn)樗軌蚴鼓阍谀骋粫r(shí)刻僅專注于實(shí)現(xiàn)的一個(gè)方面。例如,你可以專注于視圖而不去關(guān)心業(yè)務(wù)邏輯。
除了管理復(fù)雜性外,較于測(cè)試一個(gè)傳統(tǒng)型ASP.NET Web應(yīng)用程序,基于MVC模式進(jìn)行開(kāi)發(fā)使得測(cè)試應(yīng)用程序更加容易。例如,在一個(gè)傳統(tǒng)型ASP.NET Web應(yīng)用程序中,單個(gè)的類既用于顯示輸出也用于響應(yīng)用戶輸入。因此,為傳統(tǒng)型ASP.NET應(yīng)用程序編寫(xiě)自動(dòng)化測(cè)試可能非常復(fù)雜,因?yàn)闉榱藴y(cè)試單個(gè)頁(yè)面,你必須實(shí)例化頁(yè)面類,它所有的子控件以及應(yīng)用程序中的其他依賴類??傊?,你需要實(shí)例化大量的類才能夠運(yùn)行該頁(yè)面,所以這種情況下要比針對(duì)應(yīng)用程序的單個(gè)部件編寫(xiě)測(cè)試?yán)щy得多。于是,針對(duì)傳統(tǒng)型ASP.NET應(yīng)用程序的測(cè)試很可能比實(shí)現(xiàn)一個(gè)使用MVC框架開(kāi)發(fā)的應(yīng)用程序的測(cè)試要復(fù)雜和艱難得多。而且,一個(gè)傳統(tǒng)型ASP.NET應(yīng)用程序在測(cè)試時(shí)還需要使用一個(gè)Web服務(wù)器。相比之下,MVC框架把組件分離開(kāi)來(lái)并且大量地使用接口,這使得有可能獨(dú)立于框架的其他部分而較容易地單獨(dú)測(cè)試單個(gè)組件。
此外,一個(gè)MVC應(yīng)用程序的三個(gè)主要組件之間的松耦合特征還推動(dòng)了平行開(kāi)發(fā)。例如,一名開(kāi)發(fā)人員可以開(kāi)發(fā)視圖,而另一名開(kāi)發(fā)人員則在開(kāi)發(fā)控制器邏輯,第三名程序員則可以專注于模型部分的業(yè)務(wù)邏輯的開(kāi)發(fā)。
基于MVC框架Web應(yīng)用程序的優(yōu)點(diǎn)
歸納來(lái)看,ASP.NET MVC框架主要提供了下列優(yōu)點(diǎn):
通過(guò)把一個(gè)應(yīng)用程序分離成相互獨(dú)立的模型、視圖和控制器三部分而進(jìn)一步提高了應(yīng)用程序復(fù)雜性的管理。
不再使用視圖狀態(tài)或基于服務(wù)器的表單技術(shù)。這使得MVC框架特別有利于想全面控制一個(gè)應(yīng)用程序的行為的開(kāi)發(fā)人員。
使用一種前端控制器(Front Controller)模式并通過(guò)單一的控制器來(lái)處理Web應(yīng)用程序請(qǐng)求。這一特征使你有可能設(shè)計(jì)出一個(gè)支持極其豐富的路由基礎(chǔ)結(jié)構(gòu)的應(yīng)用程序。有關(guān)于前端控制器的更多的信息,請(qǐng)參考http://go.microsoft.com/fwlink/?LinkId=106357。
提供對(duì)于測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD)的大力支持。
基于Web表單Web應(yīng)用程序的優(yōu)點(diǎn)
傳統(tǒng)型基于Web表單的框架能夠提供下列優(yōu)點(diǎn):
支持事件模型。此模型能夠保留HTTP傳輸過(guò)程中的狀態(tài),而這十分有利于在線業(yè)務(wù)式Web應(yīng)用程序的開(kāi)發(fā)?;赪eb表單的應(yīng)用程序提供大量的事件,所有這些事件都得到數(shù)以百計(jì)的服務(wù)器控件的支持。
使用一種頁(yè)面控制器(Page Controller)模式,此模式能夠把許多功能添加到單個(gè)的頁(yè)面。有關(guān)于頁(yè)面控制器的更多的信息,請(qǐng)參考http://msdn.microsoft.com/zh-cn/library/ms978764.aspx。
使用視圖狀態(tài)或基于服務(wù)器的表單,這使得狀態(tài)信息管理更加容易。
ASP.NET MVC框架特征
概括來(lái)看,ASP.NET MVC框架大致提供了下列重要特征:
實(shí)現(xiàn)應(yīng)用程序基本任務(wù)(輸入邏輯,業(yè)務(wù)邏輯和UI邏輯)的分離,支持測(cè)試及測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD)。MVC框架中所有的核心契約都是基于接口的,因此十分利于使用mock對(duì)象(這是一些模擬應(yīng)用程序中實(shí)際對(duì)象的模擬對(duì)象)測(cè)試工程。你可以對(duì)應(yīng)用程序進(jìn)行單元測(cè)試而不必在真正的ASP.NET進(jìn)程中運(yùn)行控制器,這加快了單元測(cè)試的速度和靈活性。你可以使用與.NET框架相兼容的任何單元測(cè)試框架測(cè)試你的工程。
提供了一個(gè)可擴(kuò)展的和可插接的框架。ASP.NET MVC框架組件的設(shè)計(jì)支持用戶十分容易地對(duì)它們進(jìn)行替換或定制。你可以設(shè)計(jì)并加入你自己的視圖引擎,URL路由策略,行為方法參數(shù)串行化,以及其它組件。ASP.NET MVC框架還支持使用現(xiàn)有依賴性注入(即“Dependency Injection”,簡(jiǎn)稱“DI”)和控制反轉(zhuǎn)(IOC)容器模型。其中,DI允許你把對(duì)象注入到一個(gè)類中,而不是依賴于類去創(chuàng)建對(duì)象本身。而IOC指定,如果一個(gè)對(duì)象要求使用另一個(gè)對(duì)象,那么第一個(gè)對(duì)象應(yīng)該從一個(gè)外部源(例如一個(gè)配置文件)得到第二個(gè)對(duì)象。這一支持極有利于對(duì)工程的測(cè)試。
實(shí)現(xiàn)了一個(gè)強(qiáng)有力的URL映射組件,支持你在應(yīng)用程序中構(gòu)建易于理解的可搜索的URL(而不是像諸多Web應(yīng)用URL中的那種極其復(fù)雜的表達(dá)方式)。如今,URL中不必包括文件擴(kuò)展名,而且其設(shè)計(jì)還支持URL命名模式。因此,這種模式有利于搜索引擎優(yōu)化(SEO)和REST(表述性狀態(tài)轉(zhuǎn)移)尋址。
支持在現(xiàn)有ASP.NET頁(yè)面(.aspx文件)、用戶控件(.ascx文件)以及母版頁(yè)面(.master文件)標(biāo)記文件中把標(biāo)記用作視圖模板。你可以在使用ASP.NET MVC框架的過(guò)程中繼續(xù)使用現(xiàn)有ASP.NET特征,例如嵌套的母版頁(yè)面,內(nèi)聯(lián)表達(dá)式(<%=%>),聲明性服務(wù)器控件,模板,數(shù)據(jù)綁定,本地化,等等。
支持現(xiàn)有ASP.NET特征。ASP.NET MVC框架支持你使用例如表單和Windows認(rèn)證,URL授權(quán),會(huì)員和角色,輸出緩沖和數(shù)據(jù)緩沖,會(huì)話和配置狀態(tài)管理,健康監(jiān)視,配置系統(tǒng),提供者架構(gòu),以及其它ASP.NET特征。
URL映射
典型情況下,在一個(gè)ASP.NET網(wǎng)站中,URL會(huì)被映射到存儲(chǔ)在磁盤(pán)上的文件(主要是指.aspx文件)。這些.aspx文件中將包括針對(duì)客戶端發(fā)出的請(qǐng)求要處理的代碼或標(biāo)記。
ASP.NET MVC框架以不同于ASP.NET網(wǎng)站應(yīng)用程序的方式把URL映射到服務(wù)器代碼。MVC框架不是把URL映射到ASP.NET頁(yè)面或HTTP處理器程序,而是直接把URL映射到特定的控制器類。然后,由控制器類負(fù)責(zé)處理發(fā)來(lái)的請(qǐng)求,例如用戶輸入與交互,以及基于用戶輸入執(zhí)行適當(dāng)?shù)膽?yīng)用程序及數(shù)據(jù)邏輯。典型地,一個(gè)控制器類調(diào)用一個(gè)單獨(dú)的視圖組件來(lái)生成相應(yīng)的HTML輸出作為對(duì)客戶端發(fā)出請(qǐng)求的響應(yīng)。
在ASP.NET MVC框架中,模型、視圖和控制器組件被分離開(kāi)來(lái)。典型地,模型組件主要負(fù)責(zé)維護(hù)數(shù)據(jù)庫(kù)中持久數(shù)據(jù)的狀態(tài),而視圖組件則由控制器進(jìn)行選擇并最終在客戶端生成相應(yīng)的UI。默認(rèn)情況下,ASP.NET MVC框架使用現(xiàn)有ASP.NET頁(yè)面(.aspx),母版頁(yè)面(.master)和用戶控件(.ascx)類型作為在瀏覽器端的輸出形式??刂破鹘M件將定位控制器中適當(dāng)?shù)男袨榉椒ǎ〉糜米餍袨榉椒ǖ膮?shù)值,處理執(zhí)行行為期間所有可能發(fā)生的錯(cuò)誤,并生成要求的視圖。每一組組件各自存在于一個(gè)MVC Web應(yīng)用程序工程的一個(gè)單獨(dú)的文件夾下。
通過(guò)提供了一個(gè)URL映射引擎,ASP.NET MVC框架在把映射URL到控制器類方面提供了相當(dāng)?shù)撵`活性。你可以使用這種映射引擎來(lái)定義路由規(guī)則,然后ASP.NET MVC框架使用這些路由規(guī)則來(lái)計(jì)算發(fā)來(lái)的URL請(qǐng)求并選擇要執(zhí)行的控制器。你還可以讓路由引擎自動(dòng)地分析URL中定義的變量并且使ASP.NET MVC框架把這些內(nèi)容以參數(shù)方式傳遞給控制器。
MVC框架與頁(yè)面回寄
ASP.NET MVC框架并不使用傳統(tǒng)的ASP.NET回寄模型來(lái)實(shí)現(xiàn)與服務(wù)器端的交互。代之的是,所有的終端用戶交互都被路由到一個(gè)控制器類。這有利于保持UI邏輯和業(yè)務(wù)邏輯的分離,并且有助于測(cè)試目的。結(jié)果是,ASP.NET視圖狀態(tài)和ASP.NET頁(yè)面生命周期事件并沒(méi)有與基于MVC的視圖集成到一起。
本文節(jié)選自朱先忠的博客:《ASP.NET 3.5 MVC框架深度解析》。
【編輯推薦】


















