跟着官网学ASP.NET Core 6.0之请求参数模型绑定

跟着官网学ASP.NET Core 6.0之请求参数模型绑定

这一节,我们继续跟着官网来学习一下模型绑定,什么是模型绑定呢?我理解为将HTTP请求到控制器的请求参数映射为.NET里面的一个对象。接下来,我们就来实践实践

一般情况,我们的请求数据是通过这几种方式传递给服务端的,就是官网所说的源

  • URL地址
  • 路由
  • Body
  • 表单
  • 请求头
  • 上传文件

前面几个几种都有对应的方式,这文件上传的方式较为特殊一点,需要用IFormFileIEnumerable<IFormFile>来接收并绑定。在开始之前,我先新建一个ModelBindController的控制器,这样才好演示,接下来便进入正题,其实,在ASP.NET Core 6.0有6中常用的From来接收不同源的参数,这里我们先学习五种:

  • [FromQuery] - 从查询字符串中获取值。
  • [FromRoute] - 从路由数据中获取值。
  • [FromForm] - 从发布的表单域中获取值。
  • [FromBody] - 从请求正文中获取值。
  • [FromHeader] - 从 HTTP 标头中获取值。

FromQuery

FromQuery特性便是用来接收URL里面的参数值,根据URL里面的键值对来映射,先看一个简单的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Route("api/[controller]")]
[ApiController]
public class ModelBindController : ControllerBase
{
private readonly ILogger<ModelBindController> _logger;
public ModelBindController(ILogger<ModelBindController> logger) {
_logger = logger;
}

[HttpGet]
public void GetUrlParams([FromQuery] string name)
{
_logger.LogInformation(name);

}
}

此时,我们通过GET方式来访问api/ModelBind?name=6666,便会在日志中打印出接受到的值

其实,默认情况下,我们也不需要去手动指定这种简单是值映射类型,类似上面的这种情况,其实我们不需要指定[FromQuery],直接定义一个和参数一致的变量名便可接收到参数值。在参数较多时候,我们便需要使用一个类来接收,这里,我新建一个名为ModelBindVo

1
2
3
4
5
6
7
public class ModelBindVo
{
public string Name { get; set; }

public int Age { get; set; }

}

这时就需要使用FromQuery来指定参数来源

1
2
3
4
5
6
[HttpGet]
public void GetUrlParams([FromQuery] ModelBindVo vo)
{
_logger.LogInformation(String.Format("{0},{1}",vo.Name,vo.Age));

}

此时在通过api/ModelBind?name=6666&age=90来访问,便能将参数自动绑定到ModelBindVo的对象上,

FromRoute

FromRoute是从路由中获取值,一般情况下,我们会这样使用路由

1
2
3
4
5
6
[HttpGet("{name}")]
public void GetRouteParams(string name)
{
_logger.LogInformation(name);

}

这时候,我们访问api/ModelBind/999时,name便能接受到参数值,如果我们想路由里面多传几个值怎么办呢?很简单,我们需要这么干

1
2
3
4
5
6
7
[Route("{Name}/{Age}")]
[HttpGet]
public void GetRouteParams([FromRoute] ModelBindVo vo)
{
_logger.LogInformation(String.Format("FromRoute:{0},{1}", vo.Name, vo.Age));

}

这时候,我们通过api/ModelBind/6666/90来访问,便能取到对应的值啦。

FromBody

FromBody其实就是接受Body里面比较复杂的参数,我们还是用前面的对象,只不过需要把参数放在Body中传递

1
2
3
4
5
6
[HttpPost]
public void GetBodyParams([FromBody] ModelBindVo vo)
{
_logger.LogInformation(String.Format("FromBody:{0},{1}", vo.Name, vo.Age));

}

这里,传递是JSON数据格式,默认情况下,ASP.NET Core是处理的JSON数据格式,如果想要使用其他类型,如xml,则需要通过制定Program.cs指定输入类型,然后在对应的方法上通过Consumes来执行Content-Type类型。

这里只是简单是实践了三种源对请求参数的处理,其他几种的处理方式其实差不多,无非就是通过请求头或者表单提交方式来传值,其他的就是特殊数据类型,如文件上传,这个后面实践的时候再来继续学习,下一节,我们继续跟着官网学习模型验证

跟着官网学ASP.NET Core 6.0之请求参数模型绑定

https://blogs.52fx.biz/posts/4117632286.html

作者

eyiadmin

发布于

2022-01-31

更新于

2024-05-31

许可协议

评论