ASP_MVC_完全解析篇.doc_第1頁
ASP_MVC_完全解析篇.doc_第2頁
ASP_MVC_完全解析篇.doc_第3頁
ASP_MVC_完全解析篇.doc_第4頁
ASP_MVC_完全解析篇.doc_第5頁
已閱讀5頁,還剩115頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、個人Asp.Net 全面解析來自/的文章鍵入作者姓名2010-6-17本系列文章主要從控制器、視圖和數(shù)據(jù)模型這3個Asp.Net MVC基礎(chǔ)組建來講解。Asp.Net MVC 概述原文鏈接:/learn/mvc/1. ASP.NET MVC 概覽模型-視圖-控制器(Model-View-Contoller, MVC)架構(gòu)模式將應(yīng)用程序分為了三個主要的組件:模型,視圖和控制器。ASP.NET MVC框架為ASP.NET Web表單模式提供了另一種開發(fā)模式基于MVC的Web應(yīng)用程序。ASP.NET MVC框架是一個輕量

2、的、高度可測試的表現(xiàn)層框架(與基于表單的Web應(yīng)用程序相同),它繼承在了現(xiàn)有的ASP.NET功能之中,例如模板頁和基于Membership的驗(yàn)證。MVC框架定義在了System.Web.Mvc命名空間中,并且是必不可少的,由部分System.Web命名空間支持。MVC是一個許多開發(fā)者都熟悉的、標(biāo)準(zhǔn)的設(shè)計模式。一些類型的Web應(yīng)用程序?qū)腗VC框架中受益。其他一些應(yīng)用程序?qū)^續(xù)使用基于Web表單和Postback的傳統(tǒng)ASP.NET應(yīng)用程序模式。還有一些Web應(yīng)用程序?qū)⑦@兩種方法結(jié)合;這兩種方式互不排斥。MVC框架包含下面的組件:圖1:調(diào)用一個需要參數(shù)值的控制器動作模型:模型對象是應(yīng)用程序

3、中實(shí)現(xiàn)了數(shù)據(jù)領(lǐng)域(data domain)邏輯的部分。通常,模型對象從數(shù)據(jù)庫中獲取模型狀態(tài),并且將模型狀態(tài)保存至數(shù)據(jù)庫。舉個例子,一個Product對象可能從數(shù)據(jù)庫中獲取信息,對它進(jìn)行操作,然后將更新后的信息寫回SQL Server中的Products表。在小型的應(yīng)用程序中,模型通常是一個概念上的劃分而非一個實(shí)際的劃分。舉個例子,如果應(yīng)用程序只是讀取DataSet然后發(fā)送給視圖,應(yīng)用程序沒有一個實(shí)際的模型層和相關(guān)的類。在這種情況下,DataSet就承擔(dān)了模型對象的角色。視圖:視圖是應(yīng)用程序中顯示用戶界面(UI)的組件。典型地,這個UI基于模型數(shù)據(jù)創(chuàng)建。舉個例子,Products表的編輯視圖基于

4、Products對象的狀態(tài)顯示了文本框、下拉列表,以及復(fù)選框??刂破鳎嚎刂破魇翘幚碛脩艚换サ慕M件,它與模型協(xié)作,并且最終選擇一個要呈現(xiàn)的視圖來顯示用戶界面。在MVC應(yīng)用程序中,視圖僅僅顯示信息;控制器處理并且響應(yīng)用戶輸入和交互。舉個例子,控制器處理查詢字符串值,并且將這些值傳遞給模型,模型再使用這些參數(shù)查詢數(shù)據(jù)庫。MVC模型幫助創(chuàng)建這樣的應(yīng)用程序,它能夠?qū)?yīng)用程序的各個方面區(qū)分開(輸入邏輯、業(yè)務(wù)邏輯,以及UI邏輯),同時提供這些元素之間的松耦合。這個模式指定了每一種邏輯應(yīng)該位于應(yīng)用程序的哪個位置。UI邏輯屬于視圖。輸入邏輯屬于控制器。業(yè)務(wù)邏輯屬于模型。這種分隔有助于你在創(chuàng)建應(yīng)用程序時管理復(fù)雜性

5、,因?yàn)樗軌蜃屇阍谝淮螌⒕杏趯?shí)現(xiàn)的某一方面。舉個例子,你可以集中在視圖,而不依賴于業(yè)務(wù)邏輯。除了管理復(fù)雜性以外,測試應(yīng)用程序時MVC模式比基于Web表單的ASP.NET應(yīng)用程序要簡單得多。舉個例子,在一個基于Web表單的ASP.NET應(yīng)用程序中,一個類既用于顯示輸出,也用于響應(yīng)用戶輸入。為基于Web表單的ASP.NET應(yīng)用程序編寫自動測試程序是很復(fù)雜的,因?yàn)橐獪y試每個頁面,你必須初始化頁面類,它的所有子控件,以及應(yīng)用程序中其他有所依賴的類。因?yàn)闉榱诉\(yùn)行頁面初始化了這么多的類,所以編寫專用于應(yīng)用程序單獨(dú)部分的測試就變得很困難了。測試基于Web表單的ASP.NET應(yīng)用程序因此比測試MVC應(yīng)用

6、程序更加難以實(shí)施。除此以外,基于Web表單的ASP.NET應(yīng)用程序需要一個Web服務(wù)器。MVC框架將組件進(jìn)行了解耦,并且大量使用了接口,使得測試獨(dú)立于框架其他部分的組件成為可能。MVC應(yīng)用程序三個主要組件之間的松耦合也提升了并行開發(fā)的程度。舉個例子,一個開發(fā)者可以開發(fā)視圖,第二個開發(fā)者可以開發(fā)控制器邏輯,而第三個開發(fā)者可以將精力集中于模型中的業(yè)務(wù)邏輯。1.1 決定如何創(chuàng)建MVC應(yīng)用程序你必須認(rèn)真考慮是使用ASP.NET MVC框架實(shí)現(xiàn)Web應(yīng)用程序,還是使用ASP.NET Web表單模型來實(shí)現(xiàn)Web應(yīng)用程序。MVC框架并沒有取代Web表單模型;你可以選擇使用MVC框架(如果你已經(jīng)有基于Web表

7、單的應(yīng)用程序,它們可以繼續(xù)像往常一樣工作)。對于一個特定的Web站點(diǎn),在你決定使用MVC框架或者Web窗體模型之前,權(quán)衡一下每一種方式的優(yōu)勢。1.1.1 基于MVC的Web應(yīng)用程序的優(yōu)勢ASP.NET MVC框架提供了下面的優(yōu)點(diǎn): 通過將應(yīng)用程序分為了模型、視圖和控制器,它在管理復(fù)雜性方面更加的簡單。 它不適用視圖狀態(tài)或者基于服務(wù)器的表單。對于那些想要完全控制應(yīng)用程序行為的開發(fā)者來說,MVC框架是很理想的。 通過一個控制器,它使用了Front Controller模式來處理對Web應(yīng)用程序的請求。這允許你設(shè)計出一種可以支持豐富的路由結(jié)構(gòu)的應(yīng)用程序。關(guān)于Front Controller的更多信息

8、,可以查看MSDN網(wǎng)站。 它為測試驅(qū)動開發(fā)(test-driven development, TDD)提供了更好的支持。 對于那些由大型開發(fā)者和設(shè)計者所支持的Web應(yīng)用程序來說,它運(yùn)作得很好,能夠?qū)?yīng)用程序的行為提供更高層次的控制。1.1.2 基于Web窗體的Web應(yīng)用程序的優(yōu)勢基于Web窗體的框架提供了下面的優(yōu)勢: 它支持在HTTP上保存狀態(tài)的事件模型,這有益于line-of-business的Web應(yīng)用程序開發(fā)?;赪eb窗體的應(yīng)用程序提供了大量的事件,它們被數(shù)以百計的服務(wù)器控件所支持。 它使用了一個Page Controller模式來為單個頁面添加功能。關(guān)于Page Controller

9、的更多信息,可以參考MSDN網(wǎng)站。 它使用了視圖狀態(tài)或者基于服務(wù)器的表單,這使得管理狀態(tài)信息更加容易。 對于那些想要利用大量的用于快速應(yīng)用程序開發(fā)組件的小型Web開發(fā)者和設(shè)計者團(tuán)隊來說,它工作得很好。 總的來說,對于應(yīng)用程序開發(fā)來說,它更加的簡單,因?yàn)榻M件(Page類,控件等)已經(jīng)緊密地集成了,并且通常比MVC需要編寫更少的代碼。1.2 ASP.NET MVC框架的功能ASP.NET MVC框架提供了下面的功能: 應(yīng)用程序任務(wù)的分離(輸入邏輯、業(yè)務(wù)邏輯和用戶界面邏輯),可測試性,以及默認(rèn)的測試驅(qū)動開發(fā)。MVC框架中的所有核心契約都是基于接口的,并且可以使用mock對象進(jìn)行測試,mock對象是模

10、擬的對象,它們可以模仿應(yīng)用程序中實(shí)際對象的行為。你可以對應(yīng)用程序進(jìn)行單元測試,而不需要在ASP.NET進(jìn)程中運(yùn)行控制器,這使得單元測試更快速也更靈活。 它是一個可擴(kuò)展和可插入的框架。ASP.NET MVC框架的組件設(shè)計為可以很容易地替換或者定制。你可以嵌入你自己的視圖引擎、URL路由策略、動作方法參數(shù)序列化,以及其他組件。ASP.NET MVC框架也支持使用依賴注入(Dependency Injection,DI)和控件倒置(Inversion of Control,IOC)容器模型。DI允許你將對象注入到類中,而不是基于類來創(chuàng)建對象本身。IOC制定了如果一個對象需要另一個對象,第一個對象應(yīng)該

11、由外部源,例如配置文件,獲得第二個對象。這使得測試更加容易。 一個強(qiáng)大的URL映射組件,允許你創(chuàng)建擁有著易于理解和便于搜索的URL的應(yīng)用程序。URL并不需要包含文件名擴(kuò)展,并且設(shè)計為有利于搜索引擎優(yōu)化(SEO)和表現(xiàn)狀態(tài)傳輸(representational state transfer)的URL命名模式。 支持在現(xiàn)有的ASP.NET頁面(.aspx文件)、用戶控件(.ascx文件)和模板頁(.master文件)文件中使用標(biāo)記來作為視圖模板。你可以與ASP.NET MVC框架一起使用現(xiàn)有的ASP.NET功能,例如嵌套模板頁,in-line表達(dá)式(),聲明式服務(wù)器控件、模板、數(shù)據(jù)綁定、本地化等等

12、。 支持現(xiàn)有的ASP.NET功能。ASP.NET MVC允許你使用例如表單驗(yàn)證和Windows驗(yàn)證、URL授權(quán)、成員資格和角色、輸出和數(shù)據(jù)緩存、會話和檔案狀態(tài)管理、健康監(jiān)視器、配置系統(tǒng)和Provider架構(gòu)這些ASP.NET的功能。2. 理解MVC應(yīng)用程序執(zhí)行過程對基于ASP.NET MVC的Web應(yīng)用程序發(fā)出的請求首先通過UrlRoutingModule對象,它是一個Http模塊。這個模塊對請求進(jìn)行解析,并且執(zhí)行路由選擇。UrlRoutingModule對象選擇與當(dāng)前請求所匹配的第一個路由對象(路由對象十一哥實(shí)現(xiàn)了RouteBase的類,典型地是是一個Route類的實(shí)例)。如果沒有路由匹配,

13、UrlRoutingModule對象什么也不做,并且讓請求回退到通常的Asp.Net或者IIS請求處理。從所選擇的Route對象中,UrlRoutingModule對象獲取與Route對象相關(guān)的IRouteHandler對象。典型地,在一個MVC應(yīng)用程序中,這是一個MvcRouteHandler的實(shí)例。IRouteHandler實(shí)例創(chuàng)建了一個IHttpHandler對象,并且向它傳遞IHttpContext對象。默認(rèn)情況下,MVC的IHttpHandler實(shí)例是一個MvcHandler對象。MvcHandler對象然后選擇控制器,該控制器最終處理請求。NOTE:當(dāng)ASP.NET MVC應(yīng)用程序

14、運(yùn)行在IIS7.0中時,MVC項目對文件的擴(kuò)展名沒有要求。然而,在IIS6.0中,handler要求你將.mvc文件名后綴映射到ASP.NET ISAPI DLL。模塊和處理器(handler)是ASP.NET MVC框架的入口點(diǎn)。它們執(zhí)行下面的動作: 在MVC Web應(yīng)用程序中選擇合適的控制器。 獲取一個特定的控制器實(shí)例。 調(diào)用控制器的Execute方法。下面的表列出了MVC Web項目的執(zhí)行階段。階段細(xì)節(jié)收到應(yīng)用程序的第一個請求在Global.asax文件中,Route對象添加到RouteTable對象中。執(zhí)行路由UrlRoutingModule模塊使用RouteTable集合中的第一個匹

15、配的Route對象來創(chuàng)建RouteData對象,該對象然后被用來創(chuàng)建RequestContext(IHttpContext)對象。創(chuàng)建MVC請求處理器MvcRouteHandler對象創(chuàng)建一個MvcHandler類的實(shí)例,并且將RequestContext實(shí)例傳遞給它。創(chuàng)建控制器MvcHandler對象使用RequestContext實(shí)例來識別出IControllerFactory對象(典型地,是一個DefaultControllerFactory類的實(shí)例),來創(chuàng)建控制器實(shí)例。調(diào)用動作大多數(shù)控制器都繼承自Controller基類。對于這些控制器來說,與控制器相關(guān)的ControllerActio

16、nInvoker對象決定調(diào)用控制器類的哪一個動作方法,然后調(diào)用它。執(zhí)行結(jié)果一個典型的動作方法可能會接收用戶輸入,準(zhǔn)備合適的響應(yīng)數(shù)據(jù),然后通過返回一個結(jié)果類型來執(zhí)行結(jié)果。內(nèi)置的、可以執(zhí)行的結(jié)果包括下面這些:ViewResult(呈現(xiàn)一個視圖,是最常使用的結(jié)果類型),RedirectToRouteResult、RedirectResult、ContentResult、JsonResult和EmptyResult。3. 理解模型、視圖和控制器這篇教程將為你提供ASP.NET MVC模型、視圖、控制器的高層次概覽。換言之,它解釋了ASP.NET MVC中的“M”、“V”和“C”。在讀完本教程之后,你應(yīng)

17、該能夠理解ASP.NET MVC應(yīng)用程序中的各個不同部分是如何一起工作的。你也應(yīng)該能夠理解ASP.NET MVC應(yīng)用程序與ASP.NET Web窗體應(yīng)用程序和動態(tài)服務(wù)器頁面應(yīng)用程序在構(gòu)架上有何不同。3.1 范例ASP.NET MVC應(yīng)用程序Visual Studio用于創(chuàng)建ASP.NET MVC Web應(yīng)用程序的默認(rèn)模板包括了一個極其簡單的范例應(yīng)用程序,可以使用它來理解ASP.NET MVC應(yīng)用程序的各個部分。我們將會在這篇教程中利用這個簡單的應(yīng)用程序。你可以通過啟動Visual Studio2008,并且在菜單中選擇“File(文件)”、“New Project(新建項目)”來使用MVC模板

18、創(chuàng)建一個新的ASP.NET MVC應(yīng)用程序(如圖1)。在“新建項目”對話框,在項目類型下選擇你喜歡的編程語言(Visual Basic或者C#),并且在模板下選擇ASP.NET MVC Web應(yīng)用程序。點(diǎn)擊“確定”按鈕。圖1 - 新建項目對話框當(dāng)你創(chuàng)建一個新的ASP.NET MVC應(yīng)用程序時,將會出現(xiàn)“創(chuàng)建單元測試項目(Create Unit Test Project)”對話框(如圖2)。這個對話框允許你在解決方案下創(chuàng)建一個獨(dú)立的項目用于測試你的ASP.NET MVC應(yīng)用程序。選擇選項“No, do not create a unit test project(否,不要創(chuàng)建單元測試項目)”,并

19、且點(diǎn)擊“OK(確定)”按鈕。圖2 - 創(chuàng)建單元測試對話框在新的ASP.NET MVC應(yīng)用程序創(chuàng)建好之后。你將會在解決方案瀏覽器窗口中看到幾個文件夾和文件。特別地,你將會看到三個文件夾,名字是Models、Views和Controllers。正如你從文件夾的名稱可以推測出的,這三個文件夾包含了實(shí)現(xiàn)了模型、視圖和控制器的文件。如果你展開Controller文件夾,你應(yīng)該會看到一個命名為HomeController.cs的文件。如果你展開Views文件夾,你應(yīng)該看到兩個子文件夾,名稱是Home和Shared。如果你展開Home文件夾,你將會再次看到兩個文件,名稱是About.aspx和Home.as

20、px(見圖3)。這些文件組成了這個包含在默認(rèn)ASP.NET MVC模板中的范例應(yīng)用程序。圖3 - 解決方案瀏覽器窗口你可以通過選擇菜單項“Debug(調(diào)試)”、“Start Debugging(啟動調(diào)試)”來運(yùn)行這個范例應(yīng)用程序。除此以外,你可以點(diǎn)擊F5鍵。當(dāng)你第一次運(yùn)行ASP.NET應(yīng)用程序,將會出現(xiàn)圖4中的對話框,建議你開啟調(diào)試模式。點(diǎn)擊“確定”按鈕將會運(yùn)行應(yīng)用程序。圖4 - 未開啟調(diào)試對話框當(dāng)你運(yùn)行一個ASP.NET MVC應(yīng)用程序,Visual Studio會在你的web瀏覽器中運(yùn)行應(yīng)用程序。這個范例應(yīng)用程序只含有兩個頁面:Index頁面和About頁面。當(dāng)應(yīng)用程序第一次啟動時,將會顯

21、示Index頁面(見圖5)。你可以通過點(diǎn)擊應(yīng)用程序右上角的菜單鏈接導(dǎo)航到About頁面。圖5 - Index頁面注意一下你瀏覽器地址欄中的URL。當(dāng)你點(diǎn)擊Home菜單鏈接,瀏覽器地址欄的URL將變?yōu)?Home。當(dāng)你點(diǎn)擊About菜單鏈接,瀏覽器地址欄的URL變?yōu)?About。3.2 一個URL并不等同于一個頁面當(dāng)你創(chuàng)建一個傳統(tǒng)的ASP.NET Web窗體應(yīng)用程序,或者是一個動態(tài)服務(wù)器頁面(ASP)應(yīng)用程序,在URL與頁面之間存在一對一的對應(yīng)。如果你請求服務(wù)器上的一個名為SomePage.aspx的頁面,那么最好在磁盤上有一個SomePage.aspx頁面。如果SomePage.aspx文件并不

22、存在,你將會獲得一個丑陋的404-頁面不存在錯誤。當(dāng)創(chuàng)建一個ASP.NET MVC應(yīng)用程序時則大不相同,你鍵入到瀏覽器地址欄的URL與你應(yīng)用程序中的文件之間并沒有一個對應(yīng)關(guān)系。在一個ASP.NET MVC應(yīng)用程序中,一個URL與一個控制器的動作相對應(yīng),而不是磁盤上的頁面。對于一個傳統(tǒng)的ASP.NET或者ASP應(yīng)用程序,瀏覽器請求被映射到了頁面。在ASP.NET MVC應(yīng)用程序中,瀏覽器請求被映射到了控制器動作。一個ASP.NET Web窗體應(yīng)用程序是以內(nèi)容為中心的。而一個ASP.NET MVC應(yīng)用程序則以是應(yīng)用程序邏輯為中心的。3.3 理解URL路由一個瀏覽器請求通過名叫URL路由(URL R

23、outing)的ASP.NET MVC功能被映射到了一個控制器動作。URL路由將即將到來的請求發(fā)送到了控制器動作。URL路由使用一張路由表來處理來到的請求。這個路由表在你的Web應(yīng)用程序首次啟動時創(chuàng)建。這個路由表建立在Global.asax文件中。代碼清單1包含了這個默認(rèn)的MVC Global.asax文件。代碼清單1 - Glabal.asaxusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;usingSystem.Web.Routing;names

24、paceMvcApplication1publicclassGlobalApplication: System.Web.HttpApplication publicstaticvoidRegisterRoutes(RouteCollection routes) routes.IgnoreRoute(resource.axd/*pathInfo); routes.MapRoute(Default,controller/action/id,new controller =Home, action = Index, id = ); protectedvoidApplication_Start() R

25、egisterRoutes(RouteTable.Routes); 當(dāng)ASP.NET應(yīng)用程序第一次啟動時,將調(diào)用Application_Start()方法。在代碼清單1中,這個方法調(diào)用了RegisterRoutes()方法,并且RegisterRoutes()方法創(chuàng)建了默認(rèn)的路由表。默認(rèn)的路由表只含有一個路由。這個默認(rèn)的路由將所有到來的請求分為了三個分段(一個URL分段是正斜杠之間的任何東西)。第一個分段映射到了控制器名稱,第二個分段映射到了動作名稱,最后一個分段映射到了傳遞給動作的名為Id的參數(shù)。例如,考慮下面的URL:/Product/Details/3這個URL將會被解析為像這樣的三個部

26、分:Controller = ProductControllerAction = DetailsId = 3注意到Controller后綴被添加到了控制器參數(shù)的末尾。這只是MVC的一個怪癖而已。默認(rèn)的路由包含所有三個分段的默認(rèn)值。默認(rèn)的控制器是HomeController,默認(rèn)的動作是Index,默認(rèn)的Id是一個空字符串。腦子里記下這三個默認(rèn)值,考慮下面的URL是如何被解析的:/Employee這個URL將被解析為像這樣的三個參數(shù):Controller = EmployeeControllerAction = IndexId = 最后,如果你打開一個ASP.NET MVC應(yīng)用程序而不提供任何的

27、URL(例如,http:/localhost),然后這個URL將會被解析成這樣:Controller = HomeControllerAction = IndexId = 這個請求被發(fā)送到了HomeController類的Index()動作。3.4 理解控制器控制器負(fù)責(zé)用戶與MVC應(yīng)用程序交互的方式。當(dāng)用戶發(fā)出瀏覽器請求時,控制器決定向用戶發(fā)回什么樣的響應(yīng)??刂破鞑贿^是一個類(例如,一個Visual Basic或者C#類)。這個范例ASP.NET MVC應(yīng)用程序包含一個名為HomeController.cs的控制器,它位于Controllers文件夾下。HomeController.cs的內(nèi)容

28、再次顯示在了代碼清單2中。代碼清單2 - HomeConroller.csusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;namespaceMvcApplication1.ControllerspublicclassHomeController: Controller publicActionResult Index() ViewDataTitle =Home Page; ViewDataMessage =Welcome to ASP.NET MVC

29、!;returnView(); publicActionResult About() ViewDataTitle =About Page;returnView(); 注意到HomeController擁有兩個方法,名為Index()和About()。這兩個方法對應(yīng)于控制器暴露出的兩個動作。URL /Home/Index將會調(diào)用HomeController.Index()方法,而URL /Home/About會調(diào)用HomeController.About()方法??刂破髦械娜魏喂卜椒ǘ急槐┞稙橐粋€控制器動作。對此你需要多加小心。這就意味著包含在控制器中的任何公共方法都可以由任何可以訪問互聯(lián)網(wǎng)的

30、人調(diào)用,通過在瀏覽器中輸入正確的URL。3.5 理解視圖由HomeController類暴露出的兩個控制器動作,Index()和About(),都返回了一個視圖。視圖含有將會發(fā)送給瀏覽器HTML標(biāo)記和內(nèi)容。當(dāng)使用ASP.NET MVC應(yīng)用程序時,一個視圖等同于一個頁面。你必須在正確的位置創(chuàng)建你的視圖。HomeController.Index()動作返回了一個位于以下路徑的視圖:ViewsHomeIndex.aspxHomeController.About()動作返回一個位于以下路徑的視圖:ViewsHomeAbout.aspx一般而言,如果你想為一個控制器動作返回一個視圖,那么你需要在View

31、s文件夾下創(chuàng)建一個子文件夾,這個文件夾與你的控制器同名。在子文件夾下,你必須創(chuàng)建一個.aspx文件,它的名字與控制器動作相同。代碼清單3中的文件含有About.aspx視圖。代碼清單3 - About.aspx About Us TODO: Put about content here. 如果你忽略代碼清單中的第一行,視圖剩余的大部分是由標(biāo)準(zhǔn)的HTML構(gòu)成的。你可以在這里輸入任何你想要的HTML來修改視圖的內(nèi)容。視圖非常類似于動態(tài)服務(wù)器頁面(ASP)中的頁面,或者ASP.NET的Web窗體。視圖可以含有HTML內(nèi)容和腳本。你可以使用你所喜愛的.NET語言(例如,C#或者Visual Basic

32、 .Net)編寫腳本。你使用腳本顯示動態(tài)的內(nèi)容,例如數(shù)據(jù)庫數(shù)據(jù)。3.6 理解模型我們已經(jīng)討論了控制器,我們也討論了視圖。我們需要討論的最后一個話題是模型。MVC模型是什么呢?MVC的模型包含了你應(yīng)用程序中的所有邏輯,這些邏輯沒有包含在視圖或者控制器中。模型應(yīng)該包含你的應(yīng)用程序中的所有業(yè)務(wù)邏輯和數(shù)據(jù)庫訪問邏輯。例如,如果你使用LINQ to SQL訪問數(shù)據(jù)庫,那么你可以在Models文件夾中創(chuàng)建你的LINQ to SQL類(你的dbml文件)。視圖應(yīng)該僅包含與生成用戶界面有關(guān)的邏輯??刂破鲬?yīng)該僅僅只包含最少量的邏輯,用于返回正確的視圖或者將用戶重定向到另一個動作。任何其他的事情都應(yīng)該包含在模型中

33、。通常,你應(yīng)該竭盡全力創(chuàng)建一個豐富的模型以及一個瘦小的控制器。你的控制器方法應(yīng)該只包含幾行代碼。如果一個控制器動作變得太豐富,那么你應(yīng)該考慮將這些邏輯抽取出來放置到Models文件夾的新類中。3.7 總結(jié)這篇教程為你提供了ASP.NET MVC Web應(yīng)用程序各個不同部分的一個高層次的概覽。你學(xué)習(xí)了URL路由如何將即將到來的瀏覽器請求發(fā)往特定的控制器動作。你還學(xué)習(xí)了控制器是如何協(xié)調(diào)視圖怎樣返回瀏覽器的。最后,你學(xué)習(xí)了模型是怎樣包含應(yīng)用程序的業(yè)務(wù)和數(shù)據(jù)庫訪問邏輯的。Asp.Net MVC 控制器原文鏈接:/learn/mvc/這篇教程探索了ASP.NET MVC

34、控制器(controller)、控制器動作(controller action)和動作結(jié)果(action results)這幾個主題。在讀完本篇教程之后,你將會理解控制器如何控制訪問者與ASP.NET MVC網(wǎng)站進(jìn)行交互的方式。1.理解控制器MVC控制器負(fù)責(zé)響應(yīng)對ASP.NET MVC網(wǎng)站發(fā)起的請求。每一個瀏覽器請求都映射到了一個專門的控制器。舉個例子,設(shè)想一下你在瀏覽器地址欄輸入了下面的URL:http:/localhost/product/index/3在這種情況下,將會調(diào)用一個名為ProductController的控制器。ProductController負(fù)責(zé)生成對瀏覽器請求的響應(yīng)。舉

35、個例子,控制器可能會返回一個特定的視圖,或者是將用戶重定向到另一個控制器。你可以通過在ASP.NET MVC應(yīng)用程序的Controllers文件夾下添加一個新的控制器來創(chuàng)建一個新控制器。右鍵點(diǎn)擊控制器的文件夾,并且選擇菜單項“Add(添加)”,“New(新建項)”,并選擇“MVC Controller Class(MVC控制器類)”(見圖1)。控制器的名字必須含有Controller后綴。舉個例子,控制器名稱ProductController沒什么問題,但是控制器Product就不起作用。圖1 創(chuàng)建一個新的控制器如果你創(chuàng)建一個新的名為ProductController的控制器,那么你將會獲得代

36、碼清單1所示的文件。代碼清單1 ProductController.csusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;namespaceMvcApp.ControllerspublicclassProductController: Controller publicActionResult Index() / Add action logic herethrownewNotImplementedException(); 如同你在代碼清單1中所看到的

37、,控制器不過是一個類(Visual Basic.Net 或者是C#類)。一個控制器是一個繼承自System.Web.Mvc.Controller基類的類。因?yàn)榭刂破骼^承自這個基類,所以控制器輕松地繼承了一些有用的方法(我們不久將會討論這些方法)。2. 理解控制器動作控制器暴露出控制器動作。動作是控制器的一個方法,當(dāng)你在瀏覽器地址欄輸入某一特定的URL時,將會調(diào)用這個方法。舉個例子,假設(shè)你對下面這個URL發(fā)出請求:http:/localhost/Product/Index/3在本例中,Index()方法在ProductController類上被調(diào)用。Index()方法是控制器動作的一個例子。一個

38、控制器動作必須是控制器類的一個公共方法。C#方法,默認(rèn)時,是私有方法。意識到你添加到控制器類中的任何公共方法都會自動被暴露為控制器動作(你必須非常小心,因?yàn)榭刂破鲃幼骺梢员蝗虻娜魏稳苏{(diào)用,僅僅簡單地通過在瀏覽器地址欄輸入正確的URL)??刂破鲃幼鬟€要滿足一些額外的需求。作為控制器動作來使用的方法不能夠重載。另外,控制器動作不能為靜態(tài)方法。除了這些以外,你可以將任何方法作為控制器動作來使用。3. 理解控制器結(jié)果控制器動作返回一種叫做動作結(jié)果(Action Result)的東西。動作結(jié)果是控制器動作返回給瀏覽器請求的東西。ASP.NET MVC框架支持六種標(biāo)準(zhǔn)類型的動作結(jié)果:1. ViewRes

39、ult 代表HTML及標(biāo)記。2. EmptyResult 代表無結(jié)果。3. RedirectResult 代表重定向到一個新的URL。4. RedirectToRouteResult 代表重定向到一個新的控制器動作。5. JsonResult 代表一個JSON(Javascript Object Notation)結(jié)果,它可以用于AJAX應(yīng)用程序。6. ContentResult 代表著文本結(jié)果。所有這些動作結(jié)果都繼承自ActionResult基類。在大多數(shù)情況下,控制器動作 ViewResult。例如,代碼清單2中的Index()控制器動作返回了一個ViewResult。代碼清單2 Book

40、Controller.csusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;namespaceMvcApp.ControllerspublicclassBookController: Controller publicActionResult Index() returnView(); 當(dāng)一個動作返回一個ViewResult,將會向?yàn)g覽器返回HTML。代碼清單2中的Index()方法向?yàn)g覽器返回了一個名為Index.aspx的視圖。注意到代碼清單2中的

41、Index()動作并沒有放回一個ViewResult()。而是調(diào)用了Controller基類的View()方法。通常情況下,你并不直接返回一個動作結(jié)果。而是調(diào)用Controller基類的下列方法之一:1. View 返回一個ViewResult結(jié)果。2. Redirect 返回一個RedirectResult 動作結(jié)果。3. RedirectToAction 返回一個RedirectToAction動作結(jié)果。4. RedirectToRoute 返回一個RedirectToRoute動作結(jié)果。5. Json 返回一個JsonResult動作結(jié)果。6. Content 返回一個ContentRe

42、sult動作結(jié)果。因此,如果你想向?yàn)g覽器返回一個視圖,你可以調(diào)用View()方法。如果你想要降用戶從一個控制器動作重定向到另一個,你可以調(diào)用RedirectToAction()方法。舉個例子,代碼清單3中的Details()動作要么顯示一個視圖,要么將用戶重定向到Index()動作,取決于Id參數(shù)是否含有值。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;namespaceMvcApp.ControllerspublicclassCustomerCo

43、ntroller: Controller publicActionResult Details(int? Id) if(Id =null)returnRedirectToAction(Index);returnView(); publicActionResult Index() returnView(); ContentResult動作結(jié)果很特別。你可以使用ContentResult動作結(jié)果來將動作結(jié)果作為純文本返回。舉個例子,代碼清單4中的Index()方法將消息作為了純文本返回,而不是HTML。代碼清單4 StatusController.csusingSystem;usingSystem

44、.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;namespaceMvcApp.ControllerspublicclassStatusController: Controller publicContentResult Index() returnContent(Hello World!); 當(dāng)調(diào)用StatusController.Index()動作時,并沒有返回一個視圖。而是向?yàn)g覽器返回了原始的文本“Hello World!”。如果一個控制器動作返回了一個結(jié)果,而這個結(jié)果并非一個動作結(jié)果 例

45、如,一個日期或者整數(shù) 那么結(jié)果將自動被包裝在ContentResult中。舉個例子,當(dāng)調(diào)用代碼清單5中的WorkController的Index()動作時,日期將自動作為一個ContentResult返回。代碼清單5 WorkerController.csusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;namespaceMvcApp.ControllerspublicclassWorkController: Controller publicDate

46、Time Index() returnDateTime.Now; 代碼清單5中的Index()動作返回了一個DateTime對象。ASP.NET MVC框架自動將DateTime對象轉(zhuǎn)換為一個字符串,并且將DateTime值包裝在一個ContentResult中。瀏覽器將會以純文本的方式收到日期和時間。4. 總結(jié)這篇教程的目的是為你介紹ASP.NET MVC中控制器、控制器動作以及控制器動作結(jié)果的概念。在第一部分,你學(xué)習(xí)了如何向ASP.NET MVC項目中添加新的控制器。接下來,你學(xué)習(xí)了控制器的公共方法是如何作為控制器動作暴露給全世界的。最后,我們討論了動作結(jié)果的各種不同類型,這些動作結(jié)果可以

47、從控制器動作中返回。特別地,我們討論了如何從控制器動作中返回一個ViewResult、RedirectToActionResult和ContentResult。5. 創(chuàng)建控制器這篇教程的目的是解釋如何來創(chuàng)建新的ASP.NET MVC控制器。你會學(xué)習(xí)如何通過Visual Studio Add Controller菜單和手工創(chuàng)建類文件,來創(chuàng)建控制器。5.1 使用Add Controler菜單選項創(chuàng)建一個新控制的最簡單方法是在Visual Studio的解決方案瀏覽器的Controllers文件夾上點(diǎn)擊右鍵,并且選擇Add,Controller菜單項(如圖1)。選擇這個菜單項打開了Add Contr

48、oller對話框(如圖2)。圖2:添加一個新的控制器圖3:Add Controller對話框注意到控制器名稱的第一部分在Add Controller對話框中高亮顯示了。每一個控制器的名稱必須以Controller后綴結(jié)尾。舉個例子,你可以創(chuàng)建一個叫做ProductController的控制器,但是不能創(chuàng)建一個叫做Product的控制器。NOTE:如果你創(chuàng)建一個控制器,它不含有Controller后綴,那么你將無法調(diào)用這個控制器。不要這么做 - 在犯了這個錯誤之后,我已經(jīng)浪費(fèi)了不計其數(shù)的時間。代碼清單1 - Controller/ProductController.csusingSystem;u

49、singSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;usingSystem.Web.Mvc.Ajax;namespaceMvcApplication1.ControllerspublicclassProductController: Controller / GET: /Product/publicActionResult Index() returnView(); 你應(yīng)該總是在Controllers文件夾中創(chuàng)建控制器。否則的話,就破壞了ASP.NET MVC的慣例,其他的程序員

50、將會花費(fèi)更多艱辛的時間來理解你的應(yīng)用程序。5.2 創(chuàng)建動作方法當(dāng)你創(chuàng)建一個控制器時,你可以選擇自動生成Create,Update和Details動作方法(如圖3)。如果你選擇了這個選項,那么會生成代碼2中的控制器類。圖4:自動創(chuàng)建動作方法。代碼清單2 - ControllersCustomerController.csusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;usingSystem.Web.Mvc.Ajax;namespaceMvcApplication1.ControllerspublicclassCustomerController: Controller / GET: /Customer/publicActionResult Index() returnView(); / GET: /Customer/Details/5publicActionResult Details(intid) returnView(); / GET: /Customer/CreatepublicActionResult C

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論