.net Core学习之控制器中Action概述

谢嘉
2023-12-01

前段时间一直在做Asp mvc 迁移到Asp net mvc Core中的采坑,头发掉了不少。现在我要准备记录一下这些坑:

做过asp net 都知道 我们在action中通常返回的是 JsonResult,ActionResult等,迁移过程中需要将System.web.mvc一致改为Microsoft.AspNetCore.Mvc 且返回的类型都改为IActionResult:

接下来我来详细说一下IActionResult的使用:

2-1控制器

2-1-1 概述

MVC Web框架中,路由模块会对接收到的请求进行匹配并转交由对应的控制器(Controller)进行处理。
控制器的作用就是处理接收到的请求,解析用户输入并执行对应程序理逻辑,然后返回对应的输出。

用户的输入可以是QueryString、FormData、也可以是HTTP Header、HTTP Body
控制器的输出格式通常是:HTML、JSON、XML、普通文本

2-1-2 定义

所有Controller类都必须直接或间接继承于Microsoft.AspNetCore.Mvc.ControllerBase。为了搭配视图引擎使用,ASP.NET Core MVC 框架内置了 Microsoft.AspNetCore.Mvc.Controller类,提供了一些视图引擎需要的特性。所以,默认我们继承该类即可。

2-1-3 Action

2-1-3-1 Action概述

控制器(Controller)操作(Action)就是控制器接收到请求后实际用与处理请求的程序方法/函数。

Controller接收到请求后根据路由的ActionName找到对应的Action,然后将用户的输入映射到该Action的参数,最终Action实际执行完成后再返回对应的输出。

 

题外话:【这次core迁移,我们将所有原先返回ActionResult的都改为了IActionResult,在mvc coreIActionResult是所有返回类型的基类】

2-1-3-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的请求

2-1-3-3 控制器返回类型

ASP.NET Core MVC 限定Action返回类型必须是实现了Microsoft.AspNetCore.Mvc.IActionResult接口的类型,框架本身提供了该接口的默认实现Microsoft.AspNetCore.Mvc.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

 

2-1-3-4 返回类型实例

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使用示例

定义返回ContentResultAction

public IActionResult ContentTest(){

   return Content("Content Result Test --ken.io");

}

 

 

启动项目,浏览器访问 {host:port}/art/contenttest,将看到以下输出:

ContentResult Test by ken.io

 

3、JsonResult使用示例

定义返回JsonResultAction

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,将跳转到 /

2-1-3-5 Action参数映射说明

路由将请求交由对应的Controller处理时,Controller会找到对应的Action方法,并从RouteDataHTTP请求数据(QueryString、FormData、Header等)找到执行该方法所需要的参数的值。

如果未找到参数对应的数据,且该参数类型是可以为null的类型,则null将作为参数值传递递,否则将会引发一场。

另外,Action方法也可以不定义参数,手动从RouteDataHTTP请求数据(QueryString、FormData、Header等)获取对应的参数值

参数实例:

1-1基础参数映射示例

定义接收路由参数的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

 

1-2数组参数参数映射示例

定义接收数组参数的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

 

1-3自定类型参数映射示例

在项目根目录创建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

  }

}

 

1-4自定义类型数组参数映射示例

定义接收自定义类型数组参数的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

    }

  ]

}

 

1-5 JSON类型参数映射示例

定义接收JSON类型参数的Action

public IActionResult GetPersonJson([FromBody]Person person) {

return Json(new { Message = "Action params mapping test by ken.io", Data = person });

}

1-6手动获取参数

定义手动获取参数的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”]:从表单参数中获取数据

 类似资料: