ASP.NET Core MVC/WebApi基础系列2

好久没冒泡了,算起来估计有快半年没更新博客了,估计是我第一次停更如此之久,人总有懒惰的时候,时间越长越懒惰,但是呢,不学又不行,持续的惰性是不行dei,要不然会被时光所抛弃,技术所淘汰,好吧,进入今天的主题,本节内容,我们来讲讲.NET Core当中的模型绑定系统、模型绑定原理、自定义模型绑定、混合绑定、ApiController特性本质,可能有些园友已经看过,但是效果不太好哈,这篇是解释最为详细的一篇,建议已经学过我发布课程的童鞋也看下,本篇内容略长,请保持耐心,我只讲你们会用到的或者说能够学到东西的内容。

模型绑定系统

对于模型绑定,.NET Core给我们提供了[BindRequired]、[BindNever]、[FromHeader]、[FromQuery]、[FromRoute]、[FromForm]、[FromServices]、[FromBody]等特性,[BindRequired]和[BindNever]翻译成必须绑定,从不绑定我们称之为行为绑定,而紧跟后面的五个From,翻译成从哪里来,我们称之为来源绑定,下面我们详细介绍这两种绑定类型,本节内容使用版本.NET Core 2.2版本。

行为绑定

[BindRequired]表示参数的键必须要提供,但是并不关心参数的值是否为空,[BindNever]表示忽略对属性的绑定,行为绑定看似很简单,其实不然,待我娓娓道来,首先我们来看如下代码片段。

public class Customer { [BindNever] public int Id { get; set; } } [Route("[controller]")] public class ModelBindController : Controller { [HttpPost] public IActionResult Post(Customer customer) { if (!ModelState.IsValid) { return BadRequest(ModelState); } return Ok(); } }

上述我们定义了一个Customer类,然后类中的id字段通过[BindNever]特性进行标识,接下来我们一切都通过Postman来发出请求

ASP.NET Core MVC/WebApi基础系列2

ASP.NET Core MVC/WebApi基础系列2

当我们如上发送请求时,响应将返回状态码200成功且id没有绑定上,符合我们的预期,其意思就是从不绑定属性id,好接下来我们将控制器上的Post方法参数添加[FromBody]标识看看,代码片段变成如下:

[HttpPost] public IActionResult Post([FromBody]Customer customer) { if (!ModelState.IsValid) { return BadRequest(ModelState); } return Ok(); }

ASP.NET Core MVC/WebApi基础系列2

ASP.NET Core MVC/WebApi基础系列2

这是为何,我们通过[FromBody]特性标识后,此时也将属性id加上了[BindNever]特性(代码和如上一样,不重复贴了),结果id绑定上了,说明[BindNever]特性对通过[FromBody]特性标识的参数无效,情况真的是这样吗?接下来我们尝试将[BindNever]绑定到对象看看,如下:

public class Customer { public int Id { get; set; } } [Route("[controller]")] public class ModelBindController : Controller { [HttpPost] public IActionResult Post([BindNever][FromBody]Customer customer) { if (!ModelState.IsValid) { return BadRequest(ModelState); } return Ok(); } }

上述我们将[BindNever]绑定到对象Customer上,同时对于[BindNever]和[FromBody]特性没有先后顺序,也就是说我们也可以将[FromBody]放在[BindNever]后面,接下来我们利用Postman再次发送如下请求。

ASP.NET Core MVC/WebApi基础系列2

ASP.NET Core MVC/WebApi基础系列2

此时我们可以明确看到,我们发送的请求包含id字段,且此时我们将[BindNever]绑定到对象上时,最终id则没绑定到对象上,达到我们的预期且验证通过,但是话说回来,将[BindNever]绑定到对象上毫无意义,因为此时对象上所有属性都将会被忽略。所以到这里我们可以得出[BindNever]对于[FromBody]特性请求的结论:

对于使用【FromBody】特性标识的请求,【BindNever】特性应用到模型上的属性时,此时绑定无效,应用到模型对象上时,此时将完全忽略对模型对象上的所有属性

对于来自URL或者表单上的请求,【BindNever】特性应用到模型上的属性时,此时绑定无效,应用到模型对象时,此时将完全忽略对模型对象上的所有属性

好了,接下来我们再来看看[BindRequired],我们继续给出如下代码:

public class Customer { [BindRequired] public int Id { get; set; } } [Route("[controller]")] public class ModelBindController : Controller { [HttpPost] public IActionResult Post(Customer customer) { if (!ModelState.IsValid) { return BadRequest(ModelState); } return Ok(); } }

ASP.NET Core MVC/WebApi基础系列2

ASP.NET Core MVC/WebApi基础系列2

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdsdzf.html