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


在上文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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM