Controller的運(yùn)行過程
上文我們已經(jīng)講到,控制器負(fù)責(zé)響應(yīng)瀏覽器傳送過來的所有請求。在MVC中,每一個瀏覽器請求都映射到一個控制器(Controller)中,每個請求都會有個動作(Action),只要動作存在,就可以通過該動作方法接收客戶端傳來的請求與決定響應(yīng)的視圖(View)。
我們以之前創(chuàng)建的MVC項(xiàng)目為例,打開項(xiàng)目的Index.cshtml頁面。
顯示的界面如下:
可以看到,頁面的地址欄URL為:http://localhost:61515/Home/Index
根據(jù)路由規(guī)則,Home是控制器(Controller)名,Index是動作(Action)名。所以這個URL調(diào)用的是HomeController控制器下的Index方法。
在Index方法中,只有這么一行代碼:return View();,表示返回視圖,然后返回給瀏覽器的是Views/Home文件夾下的Index.cshtml頁面。
雖然我們在Index方法中沒有指定返回哪個頁面,但根據(jù)ASP.NET MVC的約定規(guī)則,控制器會找到Views文件夾中,與Controller名稱相同文件夾下的同一方法名的頁面。所以返回的是Home下的Index.cshtml頁面。具體的有關(guān)控制器返回View的內(nèi)容下文會詳細(xì)說明。
控制器的運(yùn)行過程大體如上,從瀏覽器請求到控制器返回結(jié)果的整體流程為:
Controller請求參數(shù)處理
試想一下,我們在瀏覽器地址欄經(jīng)常能看到URL后面接很多個參數(shù),比如百度搜索:https://www.baidu.com/s?ie=UTF-8&wd=夢中的Aoede
URL后面有ie和wd兩個參數(shù),那么這種參數(shù)在MVC中是怎樣獲取的呢?
舉個例子,我們給首頁鏈接增加兩個參數(shù):http://localhost:61515/Home/Index?name=夢中的Aoede&age=18
。
那么在Index方法中,正常情況我們可以通過Request.QueryString獲取到這兩個參數(shù)。如下:
public ActionResult Index()
{
var name = Request.QueryString["name"];
var age = Request.QueryString["age"];
return Content($"name:{name},age:{age}");
}
打開http://localhost:61515/Home/Index?name=夢中的Aoede&age=18
,顯示如下:
其實(shí)在MVC中,參數(shù)的傳遞是通過模型綁定(Model Binding)機(jī)制從RequestContext中獲取到參數(shù)數(shù)據(jù)的。獲取到數(shù)據(jù)之后再將數(shù)據(jù)傳入到方法的參數(shù)中,所以我們只需要在方法中增加兩個參數(shù)即可,如下:
public ActionResult Index(string name,int age)
{
return Content($"name:{name},age:{age}");
}
打開頁面輸出結(jié)果還是一樣的:
相同的,如果瀏覽器通過POST方式傳過來一個表單,那么我們也可以在Index參數(shù)中使用表單對應(yīng)的Model實(shí)體類來接收。在此我就不贅述了。
Controller返回值說明
Action處理完請求后,會將結(jié)果返回給客戶端。Action返回的結(jié)果我們稱為動作結(jié)果(Action Result)。
所有的動作結(jié)果都繼承自ActionResult基類,以HomeController中的Index方法為例,它return的View()就是一個ViewResult類,ViewResult類也是ActionResult的子類。
ASP.NET MVC框架支持六種標(biāo)準(zhǔn)類型的動作結(jié)果:
動作名稱 | 概述 | 方法名 |
---|---|---|
ViewResult | 視圖內(nèi)容,HTML或標(biāo)記 | View |
EmptyResult | 空內(nèi)容 | |
RedirectResult | 重定向到新的URL | Redirect |
RedirectToRouteResult | 重定向到新的控制器 | RedirectToAction/RedirectToRoute |
JsonResult | 返回一個JSON(Javascript Object Notation)內(nèi)容 | Json |
ContentResult | 返回文本內(nèi)容 | Content |
需要注意的是,雖然控制器返回的是動作結(jié)果(Action Result),但在代碼中,我們調(diào)用的是Controller基類中的方法。在上文的表中有對應(yīng)的方法名。
除了以上六種動作結(jié)果以外,你還可以給Action方法返回其他類型的返回值,這個返回值會自動被包裝在ContentResult中。比如這段代碼:
public class HomeController : Controlle
{
public DateTime Index()
{
return DateTime.Now;
}
}
Index返回的是DateTime對象,而在瀏覽器中,顯示的是一個日期字符串。
MVC過濾器
過濾器在MVC中也是個非常重要的概念,本文僅簡單介紹下什么是過濾器,詳細(xì)的內(nèi)容我會在后續(xù)文章中深入說明。
過濾器(Filters)就是向請求處理管道中注入額外的邏輯。
過濾器有不同類型,MVC支持的過濾器有:授權(quán)(Authorization)、行為(Action)、結(jié)果(Result)和異常(四種),不同類型有不同的作用,詳細(xì)的內(nèi)容我會在后續(xù)內(nèi)容說明。
我們以授權(quán)(Authorization)為例簡單說明下。比如我們有個方法,只有登錄用戶才可以調(diào)用,那么我們只需要添加一個驗(yàn)證用戶是否登錄的授權(quán)過濾器,在對應(yīng)的方法上方添加此過濾器的標(biāo)記即可。
總結(jié)
通過本文可以了解到,Controller的運(yùn)行過程,Controller中Action如何獲取參數(shù)、以及Action的返回值類型等內(nèi)容。更多內(nèi)容可關(guān)注我后續(xù)文章。
-
控制器
+關(guān)注
關(guān)注
112文章
16367瀏覽量
178122 -
瀏覽器
+關(guān)注
關(guān)注
1文章
1025瀏覽量
35364 -
MVC
+關(guān)注
關(guān)注
0文章
73瀏覽量
13860
發(fā)布評論請先 登錄
相關(guān)推薦
評論