在上文ASP.NET MVC5基礎 – MVC文件架構中咱們簡單瞭解了下控制器Controller的做用,本文我將詳細介紹控制器Controller的使用方法。html
上文咱們已經講到,控制器負責響應瀏覽器傳送過來的全部請求。在MVC中,每個瀏覽器請求都映射到一個控制器(Controller)中,每一個請求都會有個動做(Action),只要動做存在,就能夠經過該動做方法接收客戶端傳來的請求與決定響應的視圖(View)。瀏覽器
咱們以以前建立的MVC項目爲例,打開項目的Index.cshtml頁面。架構
顯示的界面以下:mvc
能夠看到,頁面的地址欄URL爲:http://localhost:61515/Home/Index
框架
根據路由規則,Home是控制器(Controller)名,Index是動做(Action)名。因此這個URL調用的是HomeController控制器下的Index方法。3d
在Index方法中,只有這麼一行代碼:return View();
,表示返回視圖,而後返回給瀏覽器的是Views/Home文件夾下的Index.cshtml頁面。code
雖然咱們在Index方法中沒有指定返回哪一個頁面,但根據ASP.NET MVC的約定規則,控制器會找到Views文件夾中,與Controller名稱相同文件夾下的同一方法名的頁面。因此返回的是Home下的Index.cshtml頁面。具體的有關控制器返回View的內容下文會詳細說明。htm
控制器的運行過程大致如上,從瀏覽器請求到控制器返回結果的總體流程爲:對象
試想一下,咱們在瀏覽器地址欄常常能看到URL後面接不少個參數,好比百度搜索:https://www.baidu.com/s?ie=UTF-8&wd=夢中的Aoede 在URL後面接了ie和wd兩個參數,那麼這種參數在MVC中是怎樣獲取的呢?blog
舉個例子,咱們給首頁連接增長兩個參數: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實體類來接收。在此我就不贅述了。
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中也是個很是重要的概念,本文僅簡單介紹下什麼是過濾器,詳細的內容我會在後續文章中深刻說明。
過濾器(Filters)就是向請求處理管道中注入額外的邏輯。
過濾器有不一樣類型,MVC支持的過濾器有:受權(Authorization)、行爲(Action)、結果(Result)和異常(四種),不一樣類型有不一樣的做用。
咱們以受權(Authorization)爲例簡單說明下。好比咱們有個方法,只有登陸用戶才能夠調用,那麼咱們只須要添加一個驗證用戶是否登陸的受權過濾器,在對應的方法上方添加此過濾器的標記便可。
經過本文能夠了解到,Controller的運行過程,Controller中Action如何獲取參數、以及Action的返回值類型等內容。
更多內容可訪問個人我的博客:http://www.yunc.top/