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