ASP.NET Core 入門教程 四、ASP.NET Core MVC控制器入門

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控制器參數映射/獲取示例

二、本教程環境信息

軟件/環境 說明
操做系統 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...git

三、前置知識

你可能須要的前置知識github

  • MVC框架/模式介紹

https://baike.baidu.com/item/mvcjson

2、ASP.NET Core MVC 控制器簡介

一、ASP.NET Core MVC 控制器概述

在MVC Web框架中,路由模塊會對接收到的請求進行匹配並轉交由對應的控制器(Controller)進行處理。
控制器的做用就是處理接收到的請求,解析用戶輸入並執行對應程序理邏輯,而後返回對應的輸出。api

用戶的輸入能夠是QueryString、FormData、也能夠是HTTP Header、HTTP Body。
控制器的輸出格式一般是:HTML、JSON、XML、普通文本數組

二、控制器(Controller)的定義

全部Controller類都必須直接或間接繼承於Microsoft.AspNetCore.Mvc.ControllerBase。爲了搭配視圖引擎使用,ASP.NET Core MVC 框架內置了 Microsoft.AspNetCore.Mvc.Controller類,提供了一些視圖引擎須要的特性。因此,默認咱們繼承該類便可。瀏覽器

三、控制器(Controller)的命名

Controller類的類名(ClassName)推薦以Controller爲結尾(不區分大小寫)。
例如:併發

  • HomeController
  • TestController

路由模塊去掉結尾的Controller做爲ControllerName。
那麼對應的ControllerName則分別是HomeTest。這也是路由映射到Controller的主要標識。mvc

固然,你也能夠不以Controller做爲控制器類名(ClassName)的固定後綴,那麼路由模塊會以完整的類名(ClassName)做爲ControllerNameapp

在 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
}

3、ASP.NET Core MVC 控制器操做簡介

一、ASP.NET Core MVC 控制器操做概述

控制器(Controller)操做(Action)就是控制器接收到請求後實際用與處理請求的程序方法/函數。

Controller接收到請求後根據路由的ActionName找到對應的Action,而後將用戶的輸入映射到該Action的參數,最終Action實際執行完成後再返回對應的輸出。

二、控制器操做(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(){

    }
}

三、控制器操做(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

4、ASP.NET Core MVC Action方法返回類型示例

一、準備工做

在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"}
);

二、ContentResult使用示例

定義返回ContentResult的Action

public IActionResult ContentTest()
{
   return Content("Content Result Test --ken.io");
}

啓動項目,瀏覽器訪問 {host:port}/art/contenttest,將看到如下輸出:

ContentResult Test by ken.io

三、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"
}

四、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

五、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,將跳轉到 /

5、ASP.NET Core MVC Action方法參數映射示例

一、Action參數映射說明

路由將請求交由對應的Controller處理時,Controller會找到對應的Action方法,並從RouteData或HTTP請求數據(QueryString、FormData、Header等)找到執行該方法所須要的參數的值。

若是未找到參數對應的數據,且該參數類型是能夠爲null的類型,則null將做爲參數值傳遞遞,不然將會引起一場。

另外,Action方法也能夠不定義參數,手動從RouteData或HTTP請求數據(QueryString、FormData、Header等)獲取對應的參數值。

二、準備工做

在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"}
);

三、基礎參數映射示例

定義接收路由參數的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併發送請求,也會看到一樣輸出

image

四、數組參數參數映射示例

定義接收數組參數的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 並設置表單參數併發送請求,也會看到一樣輸出

image

五、自定類型參數映射示例

在項目根目錄建立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 並設置表單參數併發送請求,也會看到一樣輸出

image

六、自定義類型數組參數映射示例

定義接收自定義類型數組參數的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 並設置表單參數併發送請求,也會看到一樣輸出

image

七、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

image

而後設置JSON表單參數併發送請求,就會看到對應輸出

image

八、手動獲取參數示例

定義手動獲取參數的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"]:從表單參數中獲取數據

6、備註

一、附錄

  • 本文代碼示例

https://github.com/ken-io/asp...


本文首發於個人獨立博客:https://ken.io/note/asp.net-c...

相關文章
相關標籤/搜索