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

在上文ASP.NET MVC5基礎 – MVC文件架構中咱們簡單瞭解了下控制器Controller的做用,本文我將詳細介紹控制器Controller的使用方法。html

Controller的運行過程

上文咱們已經講到,控制器負責響應瀏覽器傳送過來的全部請求。在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

控制器的運行過程大致如上,從瀏覽器請求到控制器返回結果的總體流程爲:對象

Controller請求參數處理

試想一下,咱們在瀏覽器地址欄常常能看到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實體類來接收。在此我就不贅述了。

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/

相關文章
相關標籤/搜索