一、前言
1、本教程主要內容
- ASP.NET Core MVC控制器簡介
- ASP.NET Core MVC控制器操作簡介
- ASP.NET Core MVC控制器操作簡介返回類型簡介
- ASP.NET Core MVC控制器操作簡介返回類型示例
- ASP.NET Core MVC控制器參數映射邏輯說明
- ASP.NET Core MVC控制器參數映射/獲取示例
2、本教程環境信息
| 軟件/環境 | 說明 |
|---|---|
| 操作系統 | Windows 10 |
| SDK | 2.1.401 |
| ASP.NET Core | 2.1.3 |
| IDE | Visual Studio Code 1.27 |
| 瀏覽器 | Chrome 69 |
本篇代碼以下代碼進行調整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-02
3、前置知識
你可能需要的前置知識
- MVC框架/模式介紹
https://baike.baidu.com/item/mvc
二、ASP.NET Core MVC 控制器簡介
1、ASP.NET Core MVC 控制器概述
在MVC Web框架中,路由模塊會對接收到的請求進行匹配並轉交由對應的控制器(Controller)進行處理。
控制器的作用就是處理接收到的請求,解析用戶輸入並執行對應程序理邏輯,然后返回對應的輸出。
用戶的輸入可以是QueryString、FormData、也可以是HTTP Header、HTTP Body。
控制器的輸出格式通常是:HTML、JSON、XML、普通文本
2、控制器(Controller)的定義
所有Controller類都必須直接或間接繼承於Microsoft.AspNetCore.Mvc.ControllerBase。為了搭配視圖引擎使用,ASP.NET Core MVC 框架內置了 Microsoft.AspNetCore.Mvc.Controller類,提供了一些視圖引擎需要的特性。所以,默認我們繼承該類即可。
3、控制器(Controller)的命名
Controller類的類名(ClassName)推薦以Controller為結尾(不區分大小寫)。
例如:
- HomeController
- TestController
路由模塊去掉結尾的Controller作為ControllerName。
那么對應的ControllerName則分別是Home、Test。這也是路由映射到Controller的主要標識。
當然,你也可以不以Controller作為控制器類名(ClassName)的固定后綴,那么路由模塊會以完整的類名(ClassName)作為ControllerName
在 ASP.NET MVC框架中,控制器(Controller)類名必須以Controller作為后綴,但是在 ASP.NET Core MVC框架中去掉了這個限制。
以下Controller的定義都是可以的:
//推薦 public class HomeController : Controller { //ControllerName=Home } public class HomeController : BaseController { //ControllerName=Home } public class Test : Controller { //ControllerName=Test }
三、ASP.NET Core MVC 控制器操作簡介
1、ASP.NET Core MVC 控制器操作概述
控制器(Controller)操作(Action)就是控制器接收到請求后實際用與處理請求的程序方法/函數。
Controller接收到請求后根據路由的ActionName找到對應的Action,然后將用戶的輸入映射到該Action的參數,最終Action實際執行完成后再返回對應的輸出。
2、控制器操作(Action)的定義
Action必須是控制器中定義的公有非靜態方法,例如:
public class HomeController : Controller { public IActionResult Index() { return Content("Hello World ! -ken.io"); } public string Test() { return "test"; } public void DoSomething() { //DoSomething } }
按照默認的路由配置:
- Action:Index() 將響應/home/index的請求
- Action: Test() 將響應/home/test的請求
- Action: DoSomething() 將響應/home/dosomething的請求
如果你在Controller定義了一個公有的非靜態方法,但不想讓這個方法處理請求,那么可以標記為NonAction
public class HomeController : Controller { [NonAction] public void LogicMethod(){ } }
3、控制器操作(Action)返回類型說明
ASP.NET Core MVC 限定 Action返回類型必須是實現了Microsoft.AspNetCore.Mvc.IActionResult接口的類型,框架本身提供了該接口的默認實現Microsoft.AspNetCore.Mvc.ActionResult,並提供了ActionResult類的子類,用於輸出不同內容格式的需求。
不過在定義Action方法的時候,返回值類型也可以定義成string、int等,這些自定義的返回類型會在返回到響應流之前被框架自動包裝到合適的ActionResult子類型中。
常用的ActionResult子類說明
| Action返回類型 | Controller內置方法 | 說明 |
|---|---|---|
| ViewResult | View() | 將視圖數據交由Razor視圖引擎渲染 |
| PartialViewResult | PartialView() | 將視圖數據交由Razor視圖引擎部分視圖(PartialView)渲染 |
| ContentResult | Content() | 返回自定義文本 |
| JsonResult | Json() | 返回對象的JSON序列化結果 |
| FileResult | File() | 返回要寫入響應中的二進制輸出 |
| RedirectResult | Redirect() | 重定向到指定的Url |
| RedirectToRouteResult | RedirectToAction(),RedirectToRoute() | 重定向到指定的Action或者路由 |
| EmptyResult | / | 在Action返回null或者Action定義返回關鍵字是void時會被包裝為EmptyResult |
四、ASP.NET Core MVC Action方法返回類型示例
1、准備工作
在Controllers文件夾中新建ActionResultTestController.cs並繼承於Controller類用於測試。
using System; using Microsoft.AspNetCore.Mvc; namespace Ken.Tutorial.Web.Controllers { public class ActionResultTestController : Controller { } }
在Startup.cs配置該測試控制器專用路由
//配置ActionResult測試專用路由 routes.MapRoute( name: "ActionResultTest", template: "art/{action}", defaults: new { controller = "ActionResultTest"} );
2、ContentResult使用示例
定義返回ContentResult的Action
public IActionResult ContentTest() { return Content("Content Result Test --ken.io"); }
啟動項目,瀏覽器訪問 {host:port}/art/contenttest,將看到以下輸出:
ContentResult Test by ken.io
3、JsonResult使用示例
定義返回JsonResult的Action
public IActionResult JsonTest() { return Json(new { Message = "JsonResult Test", Author = "ken.io" }); }
啟動項目,瀏覽器訪問 {host:port}/art/jsontest,將看到以下輸出
{
"message": "JsonResult Test", "author": "ken.io" }
4、FileResult使用示例
定義返回FileResult的Action
public IActionResult FileTest() { var bytes = Encoding.Default.GetBytes("FileResult Test by ken.io"); return File(bytes, "application/text", "filetest.txt"); }
啟動項目,瀏覽器訪問 {host:port}/art/jsontest,將會下載文件filetest.txt。
文件內容為:
FileResult Test by ken.io
5、Redirect使用示例
定義返回Redirect相關的Action
public IActionResult RedirectTest() { return Redirect("https://ken.io"); } public IActionResult RedirectToActionTest() { return RedirectToAction("jsontest"); } public IActionResult RedirectToRouteTest() { return RedirectToRoute("Default", new { Controller = "home", Action = "index" }); }
啟動項目,瀏覽器訪問測試:
- 訪問 /art/redirecttest,將跳轉到 https://ken.io
- 訪問 /art/redirecttoactiontest,將跳轉到 /art/jsontest
- 訪問 /art/redirecttoroutetest,將跳轉到 /
五、ASP.NET Core MVC Action方法參數映射示例
1、Action參數映射說明
路由將請求交由對應的Controller處理時,Controller會找到對應的Action方法,並從RouteData或HTTP請求數據(QueryString、FormData、Header等)找到執行該方法所需要的參數的值。
如果未找到參數對應的數據,且該參數類型是可以為null的類型,則null將作為參數值傳遞遞,否則將會引發一場。
另外,Action方法也可以不定義參數,手動從RouteData或HTTP請求數據(QueryString、FormData、Header等)獲取對應的參數值。
2、准備工作
在Controllers文件夾中新建ParamsMappingTestController.cs並繼承於Controller類用於測試。
using System; using Microsoft.AspNetCore.Mvc; namespace Ken.Tutorial.Web.Controllers { public class ParamsMappingTestController:Controller { } }
在Startup.cs配置該測試控制器專用路由
//配置參數映射測試專用路由 routes.MapRoute( name: "ParamsMappingTest", template: "pmt/{action}/{id?}", defaults: new { controller = "ParamsMappingTest"} );
3、基礎參數映射示例
定義接收路由參數的Action
public IActionResult GetId(int id) { return Content($"Action params mapping test by ken.io, id:{id}"); }
啟動應用,瀏覽器訪問 /pmt/getid/1024 或者 /pmt/getid?id=1024,將會看到以下輸出:
Action params mapping test by ken.io, id:1024
或者通過PostMan等工具post訪問 /pmt/getid 在HTTP Header參數增加id=1024並發送請求,也會看到同樣輸出

4、數組參數參數映射示例
定義接收數組參數的Action
public IActionResult GetArray(string[] id) { var message = "Action params mapping test by ken.io,id:"; if (id != null) { message += string.Join(",", id); } return Content(message); }
應用啟動,瀏覽器訪問 /pmt/getarray/1,2 或者 /pmt/getarray?id=1,2,將會看到以下輸出:
Action params mapping test by ken.io,id:1,2
或者通過PostMan等工具post訪問 /pmt/getarray 並設置表單參數並發送請求,也會看到同樣輸出

5、自定類型參數映射示例
在項目根目錄創建Models文件夾,並創建Person.cs類文件
public class Person { public string Name { get; set; } public int Age { get; set; } }
定義接收自定義參數的Action
public IActionResult GetPerson(Person person) { return Json(new { Message = "Action params mapping test by ken.io", Data = person }); }
應用啟動,瀏覽器訪問 /pmt/getperson?name=ken&age=18,將會看到以下輸出:
{
"message": "Action params mapping test by ken.io", "data": { "name": "ken", "age": 18 } }
或者通過PostMan等工具post訪問 /pmt/getperson 並設置表單參數並發送請求,也會看到同樣輸出

6、自定義類型數組參數映射示例
定義接收自定義類型數組參數的Action
public IActionResult GetPersonList(List<Person> person) { return Json(new { Message = "Action params mapping test by ken.io", Data = person }); }
啟動應用,瀏覽器訪問 /pmt/getpersonlist?person[0].name=ken&person[0].age=18&person[1].name=tom&person[1].age=20
將會看到以下輸出:
{
"message": "Action params mapping test by ken.io", "data": [ { "name": "ken", "age": 18 }, { "name": "tom", "age": 20 } ] }
或者通過PostMan等工具post訪問 /pmt/getpersonlist 並設置表單參數並發送請求,也會看到同樣輸出

7、JSON類型參數映射示例
定義接收JSON類型參數的Action
public IActionResult GetPersonJson([FromBody]Person person) { return Json(new { Message = "Action params mapping test by ken.io", Data = person }); }
啟動應用,這時候我們就只能通過PostMan工具進行測試了
首先設置 Content-Type=application/json

然后設置JSON表單參數並發送請求,就會看到對應輸出

8、手動獲取參數示例
定義手動獲取參數的Action
public IActionResult GetByHand() { return Json(new { Id = RouteData.Values["id"], Name = Request.Query["name"] }); }
應用啟動后,瀏覽器訪問 /pmt/getbyhand/1024?name=ken&name=tom&age=18
將看到以下輸出:
{
"id": "1024", "name": [ "ken", "tom" ] }
RouteData.Values[“id”]:從路由數據中獲取數據
Request.Query[“name”]:從Url參數中獲取數據
Request.Form[“name”]:從表單參數中獲取數據
六、備注
1、附錄
- 本文代碼示例
https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-04
本文首發於我的獨立博客:https://ken.io/note/asp.net-core-tutorial-mvc-controller-action
