ASP.NET MVC教程:理解控制器、控制器行為和行為結(jié)果
原創(chuàng)上一篇:ASP.NET MVC教程:創(chuàng)建TaskList應(yīng)用程序
【51CTO快譯】
理解控制器
MVC控制器負(fù)責(zé)處理對(duì)ASP.NET MVC網(wǎng)站的請(qǐng)求,每個(gè)瀏覽器請(qǐng)求都被映射到一個(gè)特殊的控制器上,例如,假設(shè)你在你的瀏覽器地址欄中輸入下面的URL:
http://localhost/Product/Index/3
這時(shí)會(huì)調(diào)用ProductController控制器,productController負(fù)責(zé)產(chǎn)生瀏覽器請(qǐng)求對(duì)應(yīng)的響應(yīng),例如,控制器可能返回一個(gè)特定的視圖給瀏覽器,或控制器將用戶重定向到另一個(gè)控制器。
在你的ASP.NET MVC應(yīng)用程序的控制器文件夾下創(chuàng)建一個(gè)新的控制器,在控制器文件夾上點(diǎn)右鍵,選擇“添加” > “新項(xiàng)目”,然后選擇MVC控制器類模板(如圖1所示),控制器名稱后綴必須包括Controller,例如,productController控制器。
圖1 創(chuàng)建新控制器
如果你創(chuàng)建的新控制器名叫productController,那么你的文件內(nèi)容就如清單1所示。
清單1 productController.vb
Public Class ProductController Inherits System.Web.Mvc.Controller Function Index() ' Add action logic here Throw New NotImplementedException() End Function End Class |
正如你在清單1中所看到的,控制器就是一個(gè)類(Visual Basic .NET或c#類),控制器是一個(gè)衍生于System.Web.Mvc.Controller基礎(chǔ)類的類,因?yàn)榭刂破骼^承了這個(gè)類,因此就繼承了多個(gè)有用的方法。
理解控制器行為
控制器暴露控制器行為,當(dāng)你在你的瀏覽器地址欄中輸入一個(gè)特定的URL時(shí)就會(huì)調(diào)用一個(gè)控制器行為,例如,假設(shè)你輸入了下面的URL:
http://localhost/Product/Index/3
在這個(gè)例子中,調(diào)用了productController類的Index()方法,Index()方法是控制器行為的一個(gè)例子。
控制器行為必須是控制器類的一個(gè)公共方法,默認(rèn)情況下,Visual Basic .NET函數(shù)是公共函數(shù),這意味著默認(rèn)情況下,任何添加到控制器類的函數(shù)都作為一個(gè)控制器行為暴露在外(你必須小心這一點(diǎn),因?yàn)榭刂破餍袨榭梢员蝗魏稳苏{(diào)用)。
有幾個(gè)額外的需求必須滿足控制器行為,作為控制器行為的方法不能超載,而且,控制器行為不能是一個(gè)共享的方法,除此之外,你可以將任何方法當(dāng)做控制器行為使用。
#p#
理解行為結(jié)果
控制器行為返回的事物叫做行為結(jié)果,一個(gè)行為結(jié)果就是控制器行為返回給瀏覽器請(qǐng)求的響應(yīng)。
ASP.NET MVC框架支持六個(gè)標(biāo)準(zhǔn)類型的行為結(jié)果:
1.視圖結(jié)果(ViewResult):表示HTML和標(biāo)記。
2.空結(jié)果(EmptyResult):表示沒有結(jié)果。
3.重定向結(jié)果(RedirectResult):表示重定向到一個(gè)新的URL。
4.重定向到路由結(jié)果(RedirectToRouteResult):表示重定向到一個(gè)新的控制器行為。
5.JsonResult:表示可以用于AJAX應(yīng)用程序的JavaScript對(duì)象標(biāo)記結(jié)果。
6.內(nèi)容結(jié)果(ContentResult):表示一個(gè)文本結(jié)果。
這些行為結(jié)果都繼承自基礎(chǔ)行為結(jié)果(ActionResult)類。
大多數(shù)情況下,控制器行為返回視圖結(jié)果,例如,清單2中的Index控制器行為返回一個(gè)視圖結(jié)果。
清單2 BookController.vb
Public Class BookController Inherits System.Web.Mvc.Controller Function Index() Return View() End Function End Class |
當(dāng)一個(gè)行為返回一個(gè)視圖結(jié)果時(shí),返回給瀏覽器的就是HTML,清單2 中的Index()方法返回一個(gè)名叫Index.aspx視圖給瀏覽器。
注意清單2 中的Index()行為沒有返回ViewResult(),相反,控制器基礎(chǔ)類的View()方法被調(diào)用,正常情況下,你不用直接返回一個(gè)行為結(jié)果,相反,你可以調(diào)用下面的控制器基礎(chǔ)類方法:
1.View:返回一個(gè)ViewResult行為結(jié)果。
2.Redirect:返回一個(gè)RedirectResult行為結(jié)果。
3.RedirectToAction:返回一個(gè)RedirectToActionResult行為結(jié)果。
4.RedirectToRoute:返回一個(gè)RedirectToRouteResult行為結(jié)果。
5.Json:返回一個(gè)JsonResult行為結(jié)果。
6.Content:返回一個(gè)ContentResult行為結(jié)果。
因此,如果你想返回一個(gè)視圖(View)給瀏覽器,可以調(diào)用View()方法,如果你想將用戶重定向到另一個(gè)控制器,可以調(diào)用RedirectToAction() 方法,例如,清單3中的Details()行為要么顯示一個(gè)視圖,要么重定向到Index()行為,這依賴于Id參數(shù)是否有值。
清單3 CustomerController.vb
Public Class CustomerController Inherits System.Web.Mvc.Controller Function Details(ByVal Id As Integer?) If IsNothing(Id) Then Return RedirectToAction("Index") End If Return View() End Function Function Index() Return View() End Function End Class |
ContentResult行為結(jié)果是特殊的,你可以使用ContentResult行為結(jié)果返回一個(gè)明文行為結(jié)果,例如,清單4中的Index()方法返回一個(gè)明文消息而不是HTML。
清單4 StatusController.vb
Public Class StatusController Inherits System.Web.Mvc.Controller Function Index() Return Content("Hello World!") End Function End Class |
當(dāng)StatusController.Index() 行為被調(diào)用時(shí),不會(huì)返回一個(gè)視圖,相反,會(huì)返回一個(gè)原始文本“Hello World!”給瀏覽器。
如果控制器行為返回的結(jié)果不是一個(gè)行為結(jié)果,例如,一個(gè)日期或一個(gè)整數(shù),那么ContentResult中的結(jié)果會(huì)自動(dòng)換行,例如,清單5中的WorkController Index()行為被調(diào)用時(shí),ContentResult會(huì)自動(dòng)作為一個(gè)日期返回。
清單5 WorkController.vb
Public Class WorkController Inherits System.Web.Mvc.Controller Function Index() As DateTime Return DateTime.Now End Function End Class |
清單5中的Index()行為返回一個(gè)DateTime對(duì)象,ASP.NET MVC框架會(huì)將DateTime對(duì)象轉(zhuǎn)換成一個(gè)字符串,并且在ContentResult中的DateTime值會(huì)自動(dòng)換行,瀏覽器接收日期和時(shí)間的明文。
小結(jié)
本文的目的是向你介紹ASP.NET MVC控制器、控制器行為和控制器行為結(jié)果的概念,在***小節(jié)中,你學(xué)習(xí)了如何添加新的控制器到一個(gè)ASP.NET MVC項(xiàng)目,接下來(lái),你學(xué)習(xí)了控制器的公共方法是如何作為控制器行為暴露給所有人的,***,我們討論了控制器行為返回的不同類型的行為結(jié)果,特別是如何從控制器行為返回一個(gè)視圖結(jié)果、重定向到行為結(jié)果和內(nèi)容結(jié)果。
原文:Understanding Controllers, Controller Actions, and Action Results
作者:Stephen Walther
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】
【編輯推薦】