ASP NET_MVC_完全解析篇_第1頁
ASP NET_MVC_完全解析篇_第2頁
ASP NET_MVC_完全解析篇_第3頁
ASP NET_MVC_完全解析篇_第4頁
ASP NET_MVC_完全解析篇_第5頁
已閱讀5頁,還剩116頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、個人Asp.Net 全面解析來自HuangHao2010-5-17本系列文章主要從控制器、視圖和數(shù)據(jù)模型這3個Asp.Net MVC基礎組建來講解。Asp.Net MVC 概述原文鏈接:1. ASP.NET MVC 概覽模型-視圖-控制器(Model-View-Contoller, MVC)架構模式將應用程序分為了三個主要的組件:模型,視圖和控制器。ASP.NET MVC框架為ASP.NET Web表單模式提供了另一種開發(fā)模式基于MVC的Web應用程序。ASP.NET MVC框架是一個輕量的、高度可測試的表現(xiàn)層框架(與基于表單的Web應用程序相同),它繼承在了現(xiàn)有的ASP.NET功能之中,例如

2、模板頁和基于Membership的驗證。MVC框架定義在了System.Web.Mvc命名空間中,并且是必不可少的,由部分System.Web命名空間支持。MVC是一個許多開發(fā)者都熟悉的、標準的設計模式。一些類型的Web應用程序將從MVC框架中受益。其他一些應用程序將會繼續(xù)使用基于Web表單和Postback的傳統(tǒng)ASP.NET應用程序模式。還有一些Web應用程序將會將這兩種方法結合;這兩種方式互不排斥。MVC框架包含下面的組件:圖1:調用一個需要參數(shù)值的控制器動作模型:模型對象是應用程序中實現(xiàn)了數(shù)據(jù)領域(data domain)邏輯的部分。通常,模型對象從數(shù)據(jù)庫中獲取模型狀態(tài),并且將模型狀態(tài)

3、保存至數(shù)據(jù)庫。舉個例子,一個Product對象可能從數(shù)據(jù)庫中獲取信息,對它進行操作,然后將更新后的信息寫回SQL Server中的Products表。在小型的應用程序中,模型通常是一個概念上的劃分而非一個實際的劃分。舉個例子,如果應用程序只是讀取DataSet然后發(fā)送給視圖,應用程序沒有一個實際的模型層和相關的類。在這種情況下,DataSet就承擔了模型對象的角色。視圖:視圖是應用程序中顯示用戶界面(UI)的組件。典型地,這個UI基于模型數(shù)據(jù)創(chuàng)建。舉個例子,Products表的編輯視圖基于Products對象的狀態(tài)顯示了文本框、下拉列表,以及復選框??刂破鳎嚎刂破魇翘幚碛脩艚换サ慕M件,它與模型

4、協(xié)作,并且最終選擇一個要呈現(xiàn)的視圖來顯示用戶界面。在MVC應用程序中,視圖僅僅顯示信息;控制器處理并且響應用戶輸入和交互。舉個例子,控制器處理查詢字符串值,并且將這些值傳遞給模型,模型再使用這些參數(shù)查詢數(shù)據(jù)庫。MVC模型幫助創(chuàng)建這樣的應用程序,它能夠將應用程序的各個方面區(qū)分開(輸入邏輯、業(yè)務邏輯,以及UI邏輯),同時提供這些元素之間的松耦合。這個模式指定了每一種邏輯應該位于應用程序的哪個位置。UI邏輯屬于視圖。輸入邏輯屬于控制器。業(yè)務邏輯屬于模型。這種分隔有助于你在創(chuàng)建應用程序時管理復雜性,因為它能夠讓你在一次將精力集中于實現(xiàn)的某一方面。舉個例子,你可以集中在視圖,而不依賴于業(yè)務邏輯。除了管理

5、復雜性以外,測試應用程序時MVC模式比基于Web表單的ASP.NET應用程序要簡單得多。舉個例子,在一個基于Web表單的ASP.NET應用程序中,一個類既用于顯示輸出,也用于響應用戶輸入。為基于Web表單的ASP.NET應用程序編寫自動測試程序是很復雜的,因為要測試每個頁面,你必須初始化頁面類,它的所有子控件,以及應用程序中其他有所依賴的類。因為為了運行頁面初始化了這么多的類,所以編寫專用于應用程序單獨部分的測試就變得很困難了。測試基于Web表單的ASP.NET應用程序因此比測試MVC應用程序更加難以實施。除此以外,基于Web表單的ASP.NET應用程序需要一個Web服務器。MVC框架將組件進

6、行了解耦,并且大量使用了接口,使得測試獨立于框架其他部分的組件成為可能。MVC應用程序三個主要組件之間的松耦合也提升了并行開發(fā)的程度。舉個例子,一個開發(fā)者可以開發(fā)視圖,第二個開發(fā)者可以開發(fā)控制器邏輯,而第三個開發(fā)者可以將精力集中于模型中的業(yè)務邏輯。1.1 決定如何創(chuàng)建MVC應用程序你必須認真考慮是使用ASP.NET MVC框架實現(xiàn)Web應用程序,還是使用ASP.NET Web表單模型來實現(xiàn)Web應用程序。MVC框架并沒有取代Web表單模型;你可以選擇使用MVC框架(如果你已經有基于Web表單的應用程序,它們可以繼續(xù)像往常一樣工作)。對于一個特定的Web站點,在你決定使用MVC框架或者Web窗體

7、模型之前,權衡一下每一種方式的優(yōu)勢。1.1.1 基于MVC的Web應用程序的優(yōu)勢ASP.NET MVC框架提供了下面的優(yōu)點:· 通過將應用程序分為了模型、視圖和控制器,它在管理復雜性方面更加的簡單。· 它不適用視圖狀態(tài)或者基于服務器的表單。對于那些想要完全控制應用程序行為的開發(fā)者來說,MVC框架是很理想的。· 通過一個控制器,它使用了Front Controller模式來處理對Web應用程序的請求。這允許你設計出一種可以支持豐富的路由結構的應用程序。關于Front Controller的更多信息,可以查看MSDN網(wǎng)站。· 它為測試驅動開發(fā)(test-dr

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

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

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

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

12、ine表達式(<%>),聲明式服務器控件、模板、數(shù)據(jù)綁定、本地化等等。· 支持現(xiàn)有的ASP.NET功能。ASP.NET MVC允許你使用例如表單驗證和Windows驗證、URL授權、成員資格和角色、輸出和數(shù)據(jù)緩存、會話和檔案狀態(tài)管理、健康監(jiān)視器、配置系統(tǒng)和Provider架構這些ASP.NET的功能。2. 理解MVC應用程序執(zhí)行過程對基于ASP.NET MVC的Web應用程序發(fā)出的請求首先通過UrlRoutingModule對象,它是一個Http模塊。這個模塊對請求進行解析,并且執(zhí)行路由選擇。UrlRoutingModule對象選擇與當前請求所匹配的第一個路由對象(路由對

13、象十一哥實現(xiàn)了RouteBase的類,典型地是是一個Route類的實例)。如果沒有路由匹配,UrlRoutingModule對象什么也不做,并且讓請求回退到通常的Asp.Net或者IIS請求處理。從所選擇的Route對象中,UrlRoutingModule對象獲取與Route對象相關的IRouteHandler對象。典型地,在一個MVC應用程序中,這是一個MvcRouteHandler的實例。IRouteHandler實例創(chuàng)建了一個IHttpHandler對象,并且向它傳遞IHttpContext對象。默認情況下,MVC的IHttpHandler實例是一個MvcHandler對象。MvcHan

14、dler對象然后選擇控制器,該控制器最終處理請求。NOTE:當ASP.NET MVC應用程序運行在IIS7.0中時,MVC項目對文件的擴展名沒有要求。然而,在IIS6.0中,handler要求你將.mvc文件名后綴映射到ASP.NET ISAPI DLL。模塊和處理器(handler)是ASP.NET MVC框架的入口點。它們執(zhí)行下面的動作:· 在MVC Web應用程序中選擇合適的控制器。· 獲取一個特定的控制器實例。· 調用控制器的Execute方法。下面的表列出了MVC Web項目的執(zhí)行階段。階段細節(jié)收到應用程序的第一個請求在Global.asax文件中,Ro

15、ute對象添加到RouteTable對象中。執(zhí)行路由UrlRoutingModule模塊使用RouteTable集合中的第一個匹配的Route對象來創(chuàng)建RouteData對象,該對象然后被用來創(chuàng)建RequestContext(IHttpContext)對象。創(chuàng)建MVC請求處理器MvcRouteHandler對象創(chuàng)建一個MvcHandler類的實例,并且將RequestContext實例傳遞給它。創(chuàng)建控制器MvcHandler對象使用RequestContext實例來識別出IControllerFactory對象(典型地,是一個DefaultControllerFactory類的實例),來創(chuàng)建控

16、制器實例。調用動作大多數(shù)控制器都繼承自Controller基類。對于這些控制器來說,與控制器相關的ControllerActionInvoker對象決定調用控制器類的哪一個動作方法,然后調用它。執(zhí)行結果一個典型的動作方法可能會接收用戶輸入,準備合適的響應數(shù)據(jù),然后通過返回一個結果類型來執(zhí)行結果。內置的、可以執(zhí)行的結果包括下面這些:ViewResult(呈現(xiàn)一個視圖,是最常使用的結果類型),RedirectToRouteResult、RedirectResult、ContentResult、JsonResult和EmptyResult。3. 理解模型、視圖和控制器這篇教程將為你提供ASP.NET

17、 MVC模型、視圖、控制器的高層次概覽。換言之,它解釋了ASP.NET MVC中的“M”、“V”和“C”。在讀完本教程之后,你應該能夠理解ASP.NET MVC應用程序中的各個不同部分是如何一起工作的。你也應該能夠理解ASP.NET MVC應用程序與ASP.NET Web窗體應用程序和動態(tài)服務器頁面應用程序在構架上有何不同。3.1 范例ASP.NET MVC應用程序Visual Studio用于創(chuàng)建ASP.NET MVC Web應用程序的默認模板包括了一個極其簡單的范例應用程序,可以使用它來理解ASP.NET MVC應用程序的各個部分。我們將會在這篇教程中利用這個簡單的應用程序。你可以通過啟動

18、Visual Studio2008,并且在菜單中選擇“File(文件)”、“New Project(新建項目)”來使用MVC模板創(chuàng)建一個新的ASP.NET MVC應用程序(如圖1)。在“新建項目”對話框,在項目類型下選擇你喜歡的編程語言(Visual Basic或者C#),并且在模板下選擇ASP.NET MVC Web應用程序。點擊“確定”按鈕。圖1 - 新建項目對話框當你創(chuàng)建一個新的ASP.NET MVC應用程序時,將會出現(xiàn)“創(chuàng)建單元測試項目(Create Unit Test Project)”對話框(如圖2)。這個對話框允許你在解決方案下創(chuàng)建一個獨立的項目用于測試你的ASP.NET MVC

19、應用程序。選擇選項“No, do not create a unit test project(否,不要創(chuàng)建單元測試項目)”,并且點擊“OK(確定)”按鈕。圖2 - 創(chuàng)建單元測試對話框在新的ASP.NET MVC應用程序創(chuàng)建好之后。你將會在解決方案瀏覽器窗口中看到幾個文件夾和文件。特別地,你將會看到三個文件夾,名字是Models、Views和Controllers。正如你從文件夾的名稱可以推測出的,這三個文件夾包含了實現(xiàn)了模型、視圖和控制器的文件。如果你展開Controller文件夾,你應該會看到一個命名為HomeController.cs的文件。如果你展開Views文件夾,你應該看到兩個子文

20、件夾,名稱是Home和Shared。如果你展開Home文件夾,你將會再次看到兩個文件,名稱是About.aspx和Home.aspx(見圖3)。這些文件組成了這個包含在默認ASP.NET MVC模板中的范例應用程序。圖3 - 解決方案瀏覽器窗口你可以通過選擇菜單項“Debug(調試)”、“Start Debugging(啟動調試)”來運行這個范例應用程序。除此以外,你可以點擊F5鍵。當你第一次運行ASP.NET應用程序,將會出現(xiàn)圖4中的對話框,建議你開啟調試模式。點擊“確定”按鈕將會運行應用程序。圖4 - 未開啟調試對話框當你運行一個ASP.NET MVC應用程序,Visual Studio會

21、在你的web瀏覽器中運行應用程序。這個范例應用程序只含有兩個頁面:Index頁面和About頁面。當應用程序第一次啟動時,將會顯示Index頁面(見圖5)。你可以通過點擊應用程序右上角的菜單鏈接導航到About頁面。圖5 - Index頁面注意一下你瀏覽器地址欄中的URL。當你點擊Home菜單鏈接,瀏覽器地址欄的URL將變?yōu)?Home。當你點擊About菜單鏈接,瀏覽器地址欄的URL變?yōu)?About。3.2 一個URL并不等同于一個頁面當你創(chuàng)建一個傳統(tǒng)的ASP.NET Web窗體應用程序,或者是一個動態(tài)服務器頁面(ASP)應用程序,在URL與頁面之間存在一對一的對應。如果你請求服務器上的一個名

22、為SomePage.aspx的頁面,那么最好在磁盤上有一個SomePage.aspx頁面。如果SomePage.aspx文件并不存在,你將會獲得一個丑陋的404-頁面不存在錯誤。當創(chuàng)建一個ASP.NET MVC應用程序時則大不相同,你鍵入到瀏覽器地址欄的URL與你應用程序中的文件之間并沒有一個對應關系。在一個ASP.NET MVC應用程序中,一個URL與一個控制器的動作相對應,而不是磁盤上的頁面。對于一個傳統(tǒng)的ASP.NET或者ASP應用程序,瀏覽器請求被映射到了頁面。在ASP.NET MVC應用程序中,瀏覽器請求被映射到了控制器動作。一個ASP.NET Web窗體應用程序是以內容為中心的。而

23、一個ASP.NET MVC應用程序則以是應用程序邏輯為中心的。3.3 理解URL路由一個瀏覽器請求通過名叫URL路由(URL Routing)的ASP.NET MVC功能被映射到了一個控制器動作。URL路由將即將到來的請求發(fā)送到了控制器動作。URL路由使用一張路由表來處理來到的請求。這個路由表在你的Web應用程序首次啟動時創(chuàng)建。這個路由表建立在Global.asax文件中。代碼清單1包含了這個默認的MVC Global.asax文件。代碼清單1 - Glabal.asaxusing System;using System.Collections.Generic;using&

24、#160;System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Routing;namespace MvcApplication1     public class GlobalApplication : System.Web.HttpApplication            

25、0;  public static void RegisterRoutes(RouteCollection routes)                         routes.IgnoreRoute("resource.axd/*pathInfo");   &

26、#160;           routes.MapRoute(               "Default",               "controller/a

27、ction/id",               new  controller = "Home", action = "Index", id = ""               );   

28、;                 protected void Application_Start()                         RegisterRoutes(Rou

29、teTable.Routes);               當ASP.NET應用程序第一次啟動時,將調用Application_Start()方法。在代碼清單1中,這個方法調用了RegisterRoutes()方法,并且RegisterRoutes()方法創(chuàng)建了默認的路由表。默認的路由表只含有一個路由。這個默認的路由將所有到來的請求分為了三個分段(一個URL分段是正斜杠之間的任何東西)。第一個分段映射到了控制器名稱,第二個分段映射到了動作名稱,最后一個分段映射到了

30、傳遞給動作的名為Id的參數(shù)。例如,考慮下面的URL:/Product/Details/3這個URL將會被解析為像這樣的三個部分:Controller = ProductControllerAction = DetailsId = 3注意到Controller后綴被添加到了控制器參數(shù)的末尾。這只是MVC的一個怪癖而已。默認的路由包含所有三個分段的默認值。默認的控制器是HomeController,默認的動作是Index,默認的Id是一個空字符串。腦子里記下這三個默認值,考慮下面的URL是如何被解析的:/Employee這個URL將被解析為像這樣的三個參數(shù):Controller = Employe

31、eControllerAction = IndexId = ""最后,如果你打開一個ASP.NET MVC應用程序而不提供任何的URL(例如,http:/localhost),然后這個URL將會被解析成這樣:Controller = HomeControllerAction = IndexId = ""這個請求被發(fā)送到了HomeController類的Index()動作。3.4 理解控制器控制器負責用戶與MVC應用程序交互的方式。當用戶發(fā)出瀏覽器請求時,控制器決定向用戶發(fā)回什么樣的響應。控制器不過是一個類(例如,一個Visual Basic或者C#類)。

32、這個范例ASP.NET MVC應用程序包含一個名為HomeController.cs的控制器,它位于Controllers文件夾下。HomeController.cs的內容再次顯示在了代碼清單2中。代碼清單2 - HomeConroller.csusing System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;    namespace MvcApplicat

33、ion1.Controllers     public class HomeController : Controller               public ActionResult Index()              

34、60;          ViewData"Title" = "Home Page"               ViewData"Message" = "Welcome to ASP.NET MVC!"     

35、60;         return View();                    public ActionResult About()             

36、0;           ViewData"Title" = "About Page"               return View();             

37、  注意到HomeController擁有兩個方法,名為Index()和About()。這兩個方法對應于控制器暴露出的兩個動作。URL /Home/Index將會調用HomeController.Index()方法,而URL /Home/About會調用HomeController.About()方法??刂破髦械娜魏喂卜椒ǘ急槐┞稙橐粋€控制器動作。對此你需要多加小心。這就意味著包含在控制器中的任何公共方法都可以由任何可以訪問互聯(lián)網(wǎng)的人調用,通過在瀏覽器中輸入正確的URL。3.5 理解視圖由HomeController類暴露出的兩個控制器動作,Index()和About(),都返回了

38、一個視圖。視圖含有將會發(fā)送給瀏覽器HTML標記和內容。當使用ASP.NET MVC應用程序時,一個視圖等同于一個頁面。你必須在正確的位置創(chuàng)建你的視圖。HomeController.Index()動作返回了一個位于以下路徑的視圖:ViewsHomeIndex.aspxHomeController.About()動作返回一個位于以下路徑的視圖:ViewsHomeAbout.aspx一般而言,如果你想為一個控制器動作返回一個視圖,那么你需要在Views文件夾下創(chuàng)建一個子文件夾,這個文件夾與你的控制器同名。在子文件夾下,你必須創(chuàng)建一個.aspx文件,它的名字與控制器動作相同。代碼清單3中的文件含有Ab

39、out.aspx視圖。代碼清單3 - About.aspx<% Page Language="C#" MasterPageFile="/Views/Shared/Site.Master"AutoEventWireup="true" CodeBehind="About.aspx.cs" Inherits="MvcApplication1.Views.Home.About"%><asp:Content ID="aboutContent" ContentPlace

40、HolderID="MainContent" runat="server">     <h2>About Us</h2>     <p>          TODO: Put <em>about</em> content here.     </p></asp:Co

41、ntent>如果你忽略代碼清單中的第一行,視圖剩余的大部分是由標準的HTML構成的。你可以在這里輸入任何你想要的HTML來修改視圖的內容。視圖非常類似于動態(tài)服務器頁面(ASP)中的頁面,或者ASP.NET的Web窗體。視圖可以含有HTML內容和腳本。你可以使用你所喜愛的.NET語言(例如,C#或者Visual Basic .Net)編寫腳本。你使用腳本顯示動態(tài)的內容,例如數(shù)據(jù)庫數(shù)據(jù)。3.6 理解模型我們已經討論了控制器,我們也討論了視圖。我們需要討論的最后一個話題是模型。MVC模型是什么呢?MVC的模型包含了你應用程序中的所有邏輯,這些邏輯沒有包含在視圖或者控制器中。模型應該包含你的應用

42、程序中的所有業(yè)務邏輯和數(shù)據(jù)庫訪問邏輯。例如,如果你使用LINQ to SQL訪問數(shù)據(jù)庫,那么你可以在Models文件夾中創(chuàng)建你的LINQ to SQL類(你的dbml文件)。視圖應該僅包含與生成用戶界面有關的邏輯??刂破鲬搩H僅只包含最少量的邏輯,用于返回正確的視圖或者將用戶重定向到另一個動作。任何其他的事情都應該包含在模型中。通常,你應該竭盡全力創(chuàng)建一個豐富的模型以及一個瘦小的控制器。你的控制器方法應該只包含幾行代碼。如果一個控制器動作變得太豐富,那么你應該考慮將這些邏輯抽取出來放置到Models文件夾的新類中。3.7 總結這篇教程為你提供了ASP.NET MVC Web應用程序各個不同部分

43、的一個高層次的概覽。你學習了URL路由如何將即將到來的瀏覽器請求發(fā)往特定的控制器動作。你還學習了控制器是如何協(xié)調視圖怎樣返回瀏覽器的。最后,你學習了模型是怎樣包含應用程序的業(yè)務和數(shù)據(jù)庫訪問邏輯的。Asp.Net MVC 控制器原文鏈接:這篇教程探索了ASP.NET MVC控制器(controller)、控制器動作(controller action)和動作結果(action results)這幾個主題。在讀完本篇教程之后,你將會理解控制器如何控制訪問者與ASP.NET MVC網(wǎng)站進行交互的方式。1.理解控制器MVC控制器負責響應對ASP.NET MVC網(wǎng)站發(fā)起的請求。每一個瀏覽器請求都映射到了

44、一個專門的控制器。舉個例子,設想一下你在瀏覽器地址欄輸入了下面的URL:http:/localhost/product/index/3在這種情況下,將會調用一個名為ProductController的控制器。ProductController負責生成對瀏覽器請求的響應。舉個例子,控制器可能會返回一個特定的視圖,或者是將用戶重定向到另一個控制器。你可以通過在ASP.NET MVC應用程序的Controllers文件夾下添加一個新的控制器來創(chuàng)建一個新控制器。右鍵點擊控制器的文件夾,并且選擇菜單項“Add(添加)”,“New(新建項)”,并選擇“MVC Controller Class(MVC控制器

45、類)”(見圖1)??刂破鞯拿直仨毢蠧ontroller后綴。舉個例子,控制器名稱ProductController沒什么問題,但是控制器Product就不起作用。圖1 創(chuàng)建一個新的控制器如果你創(chuàng)建一個新的名為ProductController的控制器,那么你將會獲得代碼清單1所示的文件。代碼清單1 ProductController.csusing System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;n

46、amespace MvcApp.Controllers     public class ProductController : Controller               public ActionResult Index()           &#

47、160;             / Add action logic here               throw new NotImplementedException();          

48、0;    如同你在代碼清單1中所看到的,控制器不過是一個類(Visual Basic.Net 或者是C#類)。一個控制器是一個繼承自System.Web.Mvc.Controller基類的類。因為控制器繼承自這個基類,所以控制器輕松地繼承了一些有用的方法(我們不久將會討論這些方法)。2. 理解控制器動作控制器暴露出控制器動作。動作是控制器的一個方法,當你在瀏覽器地址欄輸入某一特定的URL時,將會調用這個方法。舉個例子,假設你對下面這個URL發(fā)出請求:http:/localhost/Product/Index/3在本例中,Index()方法在ProductCont

49、roller類上被調用。Index()方法是控制器動作的一個例子。一個控制器動作必須是控制器類的一個公共方法。C#方法,默認時,是私有方法。意識到你添加到控制器類中的任何公共方法都會自動被暴露為控制器動作(你必須非常小心,因為控制器動作可以被全球的任何人調用,僅僅簡單地通過在瀏覽器地址欄輸入正確的URL)??刂破鲃幼鬟€要滿足一些額外的需求。作為控制器動作來使用的方法不能夠重載。另外,控制器動作不能為靜態(tài)方法。除了這些以外,你可以將任何方法作為控制器動作來使用。3. 理解控制器結果控制器動作返回一種叫做動作結果(Action Result)的東西。動作結果是控制器動作返回給瀏覽器請求的東西。AS

50、P.NET MVC框架支持六種標準類型的動作結果:1. ViewResult 代表HTML及標記。2. EmptyResult 代表無結果。3. RedirectResult 代表重定向到一個新的URL。4. RedirectToRouteResult 代表重定向到一個新的控制器動作。5. JsonResult 代表一個JSON(Javascript Object Notation)結果,它可以用于AJAX應用程序。6. ContentResult 代表著文本結果。所有這些動作結果都繼承自ActionResult基類。在大多數(shù)情況下,控制器動作 ViewResult。例如,代碼清單2中的Ind

51、ex()控制器動作返回了一個ViewResult。代碼清單2 BookController.csusing System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MvcApp.Controllers     public class BookController : Controller &

52、#160;             public ActionResult Index()                         return View();    &#

53、160;          當一個動作返回一個ViewResult,將會向瀏覽器返回HTML。代碼清單2中的Index()方法向瀏覽器返回了一個名為Index.aspx的視圖。注意到代碼清單2中的Index()動作并沒有放回一個ViewResult()。而是調用了Controller基類的View()方法。通常情況下,你并不直接返回一個動作結果。而是調用Controller基類的下列方法之一:1. View 返回一個ViewResult結果。2. Redirect 返回一個RedirectResult 動作結果。3

54、. RedirectToAction 返回一個RedirectToAction動作結果。4. RedirectToRoute 返回一個RedirectToRoute動作結果。5. Json 返回一個JsonResult動作結果。6. Content 返回一個ContentResult動作結果。因此,如果你想向瀏覽器返回一個視圖,你可以調用View()方法。如果你想要降用戶從一個控制器動作重定向到另一個,你可以調用RedirectToAction()方法。舉個例子,代碼清單3中的Details()動作要么顯示一個視圖,要么將用戶重定向到Index()動作,取決于Id參數(shù)是否含有值。using&#

55、160;System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MvcApp.Controllers     public class CustomerController : Controller          

56、60;    public ActionResult Details(int? Id)                         if (Id = null)          

57、60;         return RedirectToAction("Index");               return View();               &

58、#160;    public ActionResult Index()                         return View();             &#

59、160; ContentResult動作結果很特別。你可以使用ContentResult動作結果來將動作結果作為純文本返回。舉個例子,代碼清單4中的Index()方法將消息作為了純文本返回,而不是HTML。代碼清單4 StatusController.csusing System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MvcApp.Controllers  

60、   public class StatusController : Controller               public ContentResult Index()                  

61、0;      return Content("Hello World!");               當調用StatusController.Index()動作時,并沒有返回一個視圖。而是向瀏覽器返回了原始的文本“Hello World!”。如果一個控制器動作返回了一個結果,而這個結果并非一個動作結果 例如,一個日期或者整數(shù) 那么結果將自動被包裝在ContentResul

62、t中。舉個例子,當調用代碼清單5中的WorkController的Index()動作時,日期將自動作為一個ContentResult返回。代碼清單5 WorkerController.csusing System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace MvcApp.Controllers     public clas

63、s WorkController : Controller               public DateTime Index()                         ret

64、urn DateTime.Now;               代碼清單5中的Index()動作返回了一個DateTime對象。ASP.NET MVC框架自動將DateTime對象轉換為一個字符串,并且將DateTime值包裝在一個ContentResult中。瀏覽器將會以純文本的方式收到日期和時間。4. 總結這篇教程的目的是為你介紹ASP.NET MVC中控制器、控制器動作以及控制器動作結果的概念。在第一部分,你學習了如何向ASP.NET MVC項目中添

65、加新的控制器。接下來,你學習了控制器的公共方法是如何作為控制器動作暴露給全世界的。最后,我們討論了動作結果的各種不同類型,這些動作結果可以從控制器動作中返回。特別地,我們討論了如何從控制器動作中返回一個ViewResult、RedirectToActionResult和ContentResult。5. 創(chuàng)建控制器這篇教程的目的是解釋如何來創(chuàng)建新的ASP.NET MVC控制器。你會學習如何通過Visual Studio Add Controller菜單和手工創(chuàng)建類文件,來創(chuàng)建控制器。5.1 使用Add Controler菜單選項創(chuàng)建一個新控制的最簡單方法是在Visual Studio的解決方案瀏

66、覽器的Controllers文件夾上點擊右鍵,并且選擇Add,Controller菜單項(如圖1)。選擇這個菜單項打開了Add Controller對話框(如圖2)。圖2:添加一個新的控制器圖3:Add Controller對話框注意到控制器名稱的第一部分在Add Controller對話框中高亮顯示了。每一個控制器的名稱必須以Controller后綴結尾。舉個例子,你可以創(chuàng)建一個叫做ProductController的控制器,但是不能創(chuàng)建一個叫做Product的控制器。NOTE:如果你創(chuàng)建一個控制器,它不含有Controller后綴,那么你將無法調用這個控制器。不要這么做 - 在犯了這個錯誤

67、之后,我已經浪費了不計其數(shù)的時間。代碼清單1 - Controller/ProductController.csusing System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Mvc.Ajax;namespace MvcApplication1.Controllers    public class

68、60;ProductController : Controller            /        / GET: /Product/        public ActionResult Index()         &

69、#160;          return View();            你應該總是在Controllers文件夾中創(chuàng)建控制器。否則的話,就破壞了ASP.NET MVC的慣例,其他的程序員將會花費更多艱辛的時間來理解你的應用程序。5.2 創(chuàng)建動作方法當你創(chuàng)建一個控制器時,你可以選擇自動生成Create,Update和Details動作方法(如圖3)。如果你選擇了這個選項,那么會生

70、成代碼2中的控制器類。圖4:自動創(chuàng)建動作方法。代碼清單2 - ControllersCustomerController.csusing System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Mvc.Ajax;namespace MvcApplication1.Controllers    public c

71、lass CustomerController : Controller            /        / GET: /Customer/        public ActionResult Index()       

72、;             return View();                /        / GET: /Customer/Details/5       

73、; public ActionResult Details(int id)                    return View();                /   

74、0;    / GET: /Customer/Create        public ActionResult Create()                    return View();      

75、           /        / POST: /Customer/Create        AcceptVerbs(HttpVerbs.Post)        public ActionResult Create(FormCollection c

76、ollection)                    try                            / TODO: A

77、dd insert logic here                return RedirectToAction("Index");                       

78、60;catch                            return View();                   

79、        /        / GET: /Customer/Edit/5         public ActionResult Edit(int id)                    return View();                /        / POST: /Customer/Edit/5        AcceptVerbs(HttpVerbs.Post)   

溫馨提示

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

評論

0/150

提交評論