ASP.NET MVC5基礎(chǔ)-控制器(Controller)詳解

在上文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}");
}

打開(kāi)頁(yè)面輸出結(jié)果還是一樣的:


相同的悍抑,如果瀏覽器通過(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/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末务冕,一起剝皮案震驚了整個(gè)濱河市血当,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌禀忆,老刑警劉巖臊旭,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異油湖,居然都是意外死亡巍扛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)乏德,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)撤奸,“玉大人,你說(shuō)我怎么就攤上這事喊括‰使希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵郑什,是天一觀的道長(zhǎng)府喳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蘑拯,這世上最難降的妖魔是什么钝满? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任兜粘,我火速辦了婚禮,結(jié)果婚禮上弯蚜,老公的妹妹穿的比我還像新娘孔轴。我一直安慰自己,他們只是感情好碎捺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布路鹰。 她就那樣靜靜地躺著,像睡著了一般收厨。 火紅的嫁衣襯著肌膚如雪晋柱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天诵叁,我揣著相機(jī)與錄音雁竞,去河邊找鬼。 笑死黎休,一個(gè)胖子當(dāng)著我的面吹牛浓领,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播势腮,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼漫仆!你這毒婦竟也來(lái)了捎拯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盲厌,失蹤者是張志新(化名)和其女友劉穎署照,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吗浩,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡建芙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懂扼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禁荸。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阀湿,靈堂內(nèi)的尸體忽然破棺而出赶熟,到底是詐尸還是另有隱情,我是刑警寧澤陷嘴,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布映砖,位于F島的核電站,受9級(jí)特大地震影響灾挨,放射性物質(zhì)發(fā)生泄漏邑退。R本人自食惡果不足惜竹宋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望地技。 院中可真熱鬧蜈七,春花似錦、人聲如沸乓土。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)趣苏。三九已至狡相,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間食磕,已是汗流浹背尽棕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彬伦,地道東北人滔悉。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像单绑,于是被迫代替她去往敵國(guó)和親回官。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348