模型-視圖-控制器(MVC)體系結(jié)構(gòu)模式將應(yīng)用程序分成三個(gè)主要組件:模型、視圖和控制器。 ASP.NET MVC Framework 提供用于創(chuàng)建 Web應(yīng)用程序的 ASP.NET Web 窗體模式的替代模式。 ASP.NET MVC 框架是一個(gè)可測(cè)試性非常高的輕型演示框架,(與基于 Web 窗體的應(yīng)用程序一樣)它集成了現(xiàn)有的 ASP.NET 功能,如母版頁(yè)和基于成員資格的身份驗(yàn)證。 MVC 框架在 System.Web.Mvc 程序集中定義。
簡(jiǎn)介MVC是許多開發(fā)人員熟悉的標(biāo)準(zhǔn)設(shè)計(jì)模式。一些類型的Web應(yīng)用程序?qū)⒌靡嬗贛VC框架。一些類型將繼續(xù)使用基于Web窗體和回發(fā)的傳統(tǒng) ASP.NET 應(yīng)用程序模式。其他類型的 Web 應(yīng)用程序?qū)⒔Y(jié)合這兩種方法;這兩種方法彼此互不包含。
MVC框架包括以下組件:
模型。模型對(duì)象是實(shí)現(xiàn)應(yīng)用程序數(shù)據(jù)域邏輯的應(yīng)用程序部件。通常,模型對(duì)象會(huì)檢索模型狀態(tài)并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中。例如,Product對(duì)象可能會(huì)從數(shù)據(jù)庫(kù)中檢索信息,操作該信息,然后將更新的信息寫回到 SQL Server 數(shù)據(jù)庫(kù)內(nèi)的 Products表中。
在小型應(yīng)用程序中,模型通常是概念上的分離,而不是實(shí)際分離。例如,如果應(yīng)用程序僅讀取數(shù)據(jù)集并將其發(fā)送到視圖,則該應(yīng)用程序沒有物理模型層和關(guān)聯(lián)的類。在這種情況下,數(shù)據(jù)集擔(dān)當(dāng)模型對(duì)象的作用。
視圖。視圖是顯示應(yīng)用程序用戶界面(UI)的組件。通常,此UI是用模型數(shù)據(jù)創(chuàng)建的。Products表的編輯視圖便是一個(gè)視圖示例,該視圖基于Product對(duì)象的當(dāng)前狀態(tài)顯示文本框、下拉列表和復(fù)選框。
控制器??刂破魇翘幚碛脩艚换ァ⑹褂媚P筒⒆罱K選擇要呈現(xiàn)的視圖來(lái)顯示UI的組件。在MVC應(yīng)用程序中,視圖僅顯示信息;控制器則用于處理和響應(yīng)用戶輸入和交互。例如,控制器處理查詢字符串值,并將這些值傳遞給模型,而模型可能會(huì)使用這些值來(lái)查詢數(shù)據(jù)庫(kù)。
MVC模式可以幫助您創(chuàng)建使應(yīng)用程序的不同方面(輸入邏輯、業(yè)務(wù)邏輯和 UI 邏輯)分離的應(yīng)用程序,同時(shí)可在這些元素之間提供松散耦合。該模式指定每種邏輯在應(yīng)用程序中應(yīng)處的位置。UI邏輯位于視圖中。輸入邏輯位于控制器中。業(yè)務(wù)邏輯位于模型中。在您生成應(yīng)用程序時(shí),通過(guò)使用這種分離方式,可以幫助您化繁為簡(jiǎn),因?yàn)樗梢允鼓鷤?cè)重于一次實(shí)現(xiàn)應(yīng)用程序的一個(gè)方面。例如,您可以側(cè)重于獨(dú)立于業(yè)務(wù)邏輯的視圖。
MVC應(yīng)用程序的這三個(gè)主要組件之間的松散耦合也可促進(jìn)并行開發(fā)。例如,一個(gè)開發(fā)人員可以從事視圖方面的工作,第二個(gè)開發(fā)人員可以從事控制器邏輯方面的工作,第三個(gè)開發(fā)人員可以側(cè)重于模型中的業(yè)務(wù)邏輯。
對(duì)測(cè)試驅(qū)動(dòng)的開發(fā)的支持使用MVC模式除了可以化繁為簡(jiǎn)外,還可以使應(yīng)用程序的測(cè)試工作比基于Web窗體的ASP.NETWeb應(yīng)用程序的測(cè)試工作更加輕松。例如,在基于Web窗體的ASP.NETWeb應(yīng)用程序中,單一類既用于顯示輸出又用于響應(yīng)用戶輸入。為基于Web窗體的ASP.NET應(yīng)用程序編寫自動(dòng)化測(cè)試可能是一項(xiàng)復(fù)雜的工作,因?yàn)槿粢獪y(cè)試單個(gè)頁(yè)面,您必須實(shí)例化應(yīng)用程序中的頁(yè)類、其所有子控件以及其他相關(guān)類。因?yàn)闉檫\(yùn)行頁(yè)面而實(shí)例化的類如此之多,所以可能難以編寫專門側(cè)重于應(yīng)用程序單個(gè)部件的測(cè)試。因此,與MVC應(yīng)用程序測(cè)試相比,基于Web窗體的ASP.NET應(yīng)用程序的測(cè)試更加難以實(shí)現(xiàn)。而且,基于Web窗體的ASP.NET應(yīng)用程序的測(cè)試需要Web服務(wù)器。MVC框架可使組件分離并大量使用接口,這樣,便可以將單個(gè)組件與框架的其余部分分開進(jìn)行測(cè)試。
創(chuàng)建 MVC 應(yīng)用程序您必須仔細(xì)考慮是使用ASP.NET MVC框架還是使用ASP.NET Web窗體模型來(lái)實(shí)現(xiàn)Web應(yīng)用程序。MVC框架未取代Web窗體模型;您可以對(duì)Web應(yīng)用程序使用任一框架。(如果您具有現(xiàn)有的基于Web窗體的應(yīng)用程序,則這些應(yīng)用程序?qū)⑼耆凑账鼈円回灥姆绞嚼^續(xù)工作。)
在決定對(duì)特定網(wǎng)站使用MVC框架或Web窗體模型之前,請(qǐng)權(quán)衡各種方法的優(yōu)點(diǎn)。
基于 MVC 的 Web 應(yīng)用程序的優(yōu)點(diǎn)ASP.NET MVC框架具有以下優(yōu)點(diǎn):
通過(guò)將應(yīng)用程序分為模型、視圖和控制器,化繁為簡(jiǎn)的工作更加輕松。
它不使用視圖狀態(tài)或基于服務(wù)器的窗體。這使得MVC框架特別適合想要完全控制應(yīng)用程序行為的開發(fā)人員。
它使用一種通過(guò)單一控制器處理 Web 應(yīng)用程序請(qǐng)求的前端控制器模式。這使您可以設(shè)計(jì)一個(gè)支持豐富路由基礎(chǔ)結(jié)構(gòu)的應(yīng)用程序。有關(guān)更多信息,請(qǐng)參見Front Controller(前端控制器)。
它為測(cè)試驅(qū)動(dòng)的開發(fā)(TDD)提供了更好的支持。
它非常適合大型開發(fā)人員團(tuán)隊(duì)支持的Web應(yīng)用程序,以及需要對(duì)應(yīng)用程序行為進(jìn)行嚴(yán)格控制的 Web 設(shè)計(jì)人員。
基于 Web 窗體的 Web 應(yīng)用程序的優(yōu)點(diǎn)基于Web窗體的框架具有以下優(yōu)點(diǎn):
它支持通過(guò)HTTP保留狀態(tài)的事件模型,這有益于開發(fā)業(yè)務(wù)線 Web 應(yīng)用程序?;?Web 窗體的應(yīng)用程序提供了在數(shù)百個(gè)服務(wù)器控件中受支持的許多事件。
它使用頁(yè)面控制器模式向單個(gè)頁(yè)面添加功能。有關(guān)更多信息,請(qǐng)參見Page Controller(頁(yè)面控制器)。
它針對(duì)基于服務(wù)器的窗體使用視圖狀態(tài),這使得管理狀態(tài)信息更加輕松。
它非常適合想要利用大量組件快速開發(fā)應(yīng)用程序的Web開發(fā)人員和設(shè)計(jì)人員的小型團(tuán)隊(duì)。
通常,對(duì)于應(yīng)用程序開發(fā)而言,它比較簡(jiǎn)單,這是因?yàn)榻M件(Page類、控件等)緊密集成并且通常需要比MVC模型更少的代碼。
ASP.NET MVC 框架的功能應(yīng)用程序任務(wù)(輸入邏輯、業(yè)務(wù)邏輯和UI邏輯)的分離、可測(cè)試性和測(cè)試驅(qū)動(dòng)的開發(fā)(TDD)。MVC框架中的所有核心協(xié)定都基于接口并且可使用mock對(duì)象進(jìn)行測(cè)試,mock對(duì)象是模仿應(yīng)用程序中實(shí)際對(duì)象的行為的模擬對(duì)象。您可以對(duì)應(yīng)用程序進(jìn)行單元測(cè)試,而不必在ASP.NET進(jìn)程中運(yùn)行控制器,這使得單元測(cè)試既快速又靈活。您可以使用任何與.NETFramework兼容的單元測(cè)試框架。
可擴(kuò)展且可插入的框架。設(shè)計(jì)ASP.NETMVC框架組件的目的是為了可以輕松地替換或自定義它們。您可以插入自己的視圖引擎、URL路由策略、操作方法參數(shù)序列化以及其他組件。ASP.NETMVC框架還支持使用依賴項(xiàng)注入(DI)和控制反轉(zhuǎn)(IOC)容器模型。DI使您能夠?qū)?duì)象注入到類中,而不是依靠類來(lái)創(chuàng)建對(duì)象本身。IOC指定某個(gè)對(duì)象是否需要其他對(duì)象,第一個(gè)對(duì)象應(yīng)該從配置文件之類的外部源中獲取第二個(gè)對(duì)象。這樣,測(cè)試會(huì)更加輕松。
廣泛支持ASP.NET路由,ASP.NET路由是一個(gè)功能強(qiáng)大的URL映射組件,它允許您生成具有易于理解的可搜索URL的應(yīng)用程序。URL未必包含文件擴(kuò)展名,并且旨在支持非常適合搜索引擎優(yōu)化(SEO)和具象狀態(tài)傳輸(REST)尋址的URL命名模式。
支持將現(xiàn)有ASP.NET頁(yè)面(.aspx文件)、用戶控件(.ascx文件)和母版頁(yè)(.master文件)標(biāo)記文件中的標(biāo)記用作視圖模板。您可以將諸如嵌套母版頁(yè)、內(nèi)聯(lián)表達(dá)式()、聲明性服務(wù)器控件、模板、數(shù)據(jù)綁定、本地化等現(xiàn)有ASP.NET功能與ASP.NETMVC框架結(jié)合使用。
支持現(xiàn)有ASP.NET功能。ASP.NETMVC允許您使用一些功能,如Forms身份驗(yàn)證和Windows身份驗(yàn)證、URL授權(quán)、成員資格和角色、輸出和數(shù)據(jù)緩存、會(huì)話和配置文件狀態(tài)管理、運(yùn)行狀況監(jiān)視、配置系統(tǒng)以及提供程序體系結(jié)構(gòu)。1
本詞條內(nèi)容貢獻(xiàn)者為:
王慧維 - 副研究員 - 西南大學(xué)