在上文ASP.NET MVC5基礎(chǔ) – MVC文件架構(gòu)中我們簡(jiǎn)單了解了下控制器Controller的作用拧廊,本文我將詳細(xì)介紹控制器Controller的使用方法。
Controller的運(yùn)行過(guò)程
上文我們已經(jīng)講到,控制器負(fù)責(zé)響應(yīng)瀏覽器傳送過(guò)來(lái)的所有請(qǐng)求。在MVC中,每一個(gè)瀏覽器請(qǐng)求都映射到一個(gè)控制器(Controller)中持灰,每個(gè)請(qǐng)求都會(huì)有個(gè)動(dòng)作(Action),只要?jiǎng)幼鞔嬖诟核牵涂梢酝ㄟ^(guò)該動(dòng)作方法接收客戶端傳來(lái)的請(qǐng)求與決定響應(yīng)的視圖(View)堤魁。
我們以之前創(chuàng)建的MVC項(xiàng)目為例,打開(kāi)項(xiàng)目的Index.cshtml頁(yè)面返十。
顯示的界面如下:
可以看到妥泉,頁(yè)面的地址欄URL為:http://localhost:61515/Home/Index
根據(jù)路由規(guī)則,Home是控制器(Controller)名洞坑,Index是動(dòng)作(Action)名盲链。所以這個(gè)URL調(diào)用的是HomeController控制器下的Index方法。
在Index方法中迟杂,只有這么一行代碼:return View();
刽沾,表示返回視圖,然后返回給瀏覽器的是Views/Home文件夾下的Index.cshtml頁(yè)面排拷。
雖然我們?cè)贗ndex方法中沒(méi)有指定返回哪個(gè)頁(yè)面侧漓,但根據(jù)ASP.NET MVC的約定規(guī)則,控制器會(huì)找到Views文件夾中监氢,與Controller名稱相同文件夾下的同一方法名的頁(yè)面布蔗。所以返回的是Home下的Index.cshtml頁(yè)面藤违。具體的有關(guān)控制器返回View的內(nèi)容下文會(huì)詳細(xì)說(shuō)明。
控制器的運(yùn)行過(guò)程大體如上纵揍,從瀏覽器請(qǐng)求到控制器返回結(jié)果的整體流程為:
graph TD
A(瀏覽器發(fā)起請(qǐng)求) --> B[Global.asax程序入口注冊(cè)路由器]
B --> C[路由器解析URL,調(diào)用對(duì)應(yīng)控制器方法]
C -->D[控制器處理邏輯并返回結(jié)果]
Controller請(qǐng)求參數(shù)處理
試想一下顿乒,我們?cè)跒g覽器地址欄經(jīng)常能看到URL后面接很多個(gè)參數(shù),比如百度搜索:https://www.baidu.com/s?ie=UTF-8&wd=夢(mèng)中的Aoede 在URL后面接了ie和wd兩個(gè)參數(shù)泽谨,那么這種參數(shù)在MVC中是怎樣獲取的呢璧榄?
舉個(gè)例子,我們給首頁(yè)鏈接增加兩個(gè)參數(shù):http://localhost:61515/Home/Index?name=夢(mèng)中的Aoede&age=18
隔盛。
那么在Index方法中犹菱,正常情況我們可以通過(guò)Request.QueryString獲取到這兩個(gè)參數(shù)。如下:
public ActionResult Index()
{
var name = Request.QueryString["name"];
var age = Request.QueryString["age"];
return Content($"name:{name},age:{age}");
}
打開(kāi)http://localhost:61515/Home/Index?name=夢(mèng)中的Aoede&age=18
吮炕,顯示如下:
其實(shí)在MVC中,參數(shù)的傳遞是通過(guò)模型綁定(Model Binding)機(jī)制從RequestContext中獲取到參數(shù)數(shù)據(jù)的访得。獲取到數(shù)據(jù)之后再將數(shù)據(jù)傳入到方法的參數(shù)中龙亲,所以我們只需要在方法中增加兩個(gè)參數(shù)即可,如下:
public ActionResult Index(string name,int age)
{
return Content($"name:{name},age:{age}");
}
相同的悍抑,如果瀏覽器通過(guò)POST方式傳過(guò)來(lái)一個(gè)表單鳄炉,那么我們也可以在Index參數(shù)中使用表單對(duì)應(yīng)的Model實(shí)體類來(lái)接收。在此我就不贅述了搜骡。
Controller返回值說(shuō)明
Action處理完請(qǐng)求后拂盯,會(huì)將結(jié)果返回給客戶端。Action返回的結(jié)果我們稱為動(dòng)作結(jié)果(Action Result)记靡。
所有的動(dòng)作結(jié)果都繼承自ActionResult基類谈竿,以HomeController中的Index方法為例,它return的View()就是一個(gè)ViewResult類摸吠,ViewResult類也是ActionResult的子類空凸。
ASP.NET MVC框架支持六種標(biāo)準(zhǔn)類型的動(dòng)作結(jié)果:
動(dòng)作名稱 | 概述 | 方法名 |
---|---|---|
ViewResult | 視圖內(nèi)容,HTML或標(biāo)記 | View |
EmptyResult | 空內(nèi)容 | |
RedirectResult | 重定向到新的URL | Redirect |
RedirectToRouteResult | 重定向到新的控制器 | RedirectToAction/RedirectToRoute |
JsonResult | 返回一個(gè)JSON(Javascript Object Notation)內(nèi)容 | Json |
ContentResult | 返回文本內(nèi)容 | Content |
需要注意的是寸痢,雖然控制器返回的是動(dòng)作結(jié)果(Action Result)呀洲,但在代碼中,我們調(diào)用的是Controller基類中的方法啼止。在上文的表中有對(duì)應(yīng)的方法名道逗。
除了以上六種動(dòng)作結(jié)果以外,你還可以給Action方法返回其他類型的返回值献烦,這個(gè)返回值會(huì)自動(dòng)被包裝在ContentResult中滓窍。比如這段代碼:
public class HomeController : Controlle
{
public DateTime Index()
{
return DateTime.Now;
}
}
Index返回的是DateTime對(duì)象,而在瀏覽器中仿荆,顯示的是一個(gè)日期字符串贰您。
MVC過(guò)濾器
過(guò)濾器在MVC中也是個(gè)非常重要的概念坏平,本文僅簡(jiǎn)單介紹下什么是過(guò)濾器,詳細(xì)的內(nèi)容我會(huì)在后續(xù)文章中深入說(shuō)明锦亦。
過(guò)濾器(Filters)就是向請(qǐng)求處理管道中注入額外的邏輯舶替。
過(guò)濾器有不同類型,MVC支持的過(guò)濾器有:授權(quán)(Authorization)杠园、行為(Action)顾瞪、結(jié)果(Result)和異常(四種),不同類型有不同的作用抛蚁,詳細(xì)的內(nèi)容我會(huì)在后續(xù)內(nèi)容說(shuō)明陈醒。
我們以授權(quán)(Authorization)為例簡(jiǎn)單說(shuō)明下。比如我們有個(gè)方法瞧甩,只有登錄用戶才可以調(diào)用钉跷,那么我們只需要添加一個(gè)驗(yàn)證用戶是否登錄的授權(quán)過(guò)濾器,在對(duì)應(yīng)的方法上方添加此過(guò)濾器的標(biāo)記即可肚逸。
總結(jié)
通過(guò)本文可以了解到爷辙,Controller的運(yùn)行過(guò)程,Controller中Action如何獲取參數(shù)朦促、以及Action的返回值類型等內(nèi)容膝晾。更多內(nèi)容可關(guān)注我后續(xù)文章。
更多內(nèi)容可訪問(wèn)我的個(gè)人博客:http://www.yunc.top/