讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute
2021-03-21 21:23
标签:第三方 style explorer 需要 div count spn 判断 json ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性,今天主角就是 ASP.NET Core MVC 已经有了ControllerAttribute,这个用来标注一个类型是否是Controller。标注了之后框架就知道哪些是系统里面的Controller了。(框架也有其他方法来获取程序里面的Controller,所以,这个ControllerAttribute不是必须的)。 但是,因为 这个是重点,框架会帮你自动验证model的state,也就是 框架会为你自动注册 它会自动把model state 放到response里面,content type 是 下面,我们先来举个例子说一下。 顺道说一下, 另一个非常有用的特性是action里面的参数的模型绑定可以自动推断。 ASP.NET Core MVC里面有一个比较令人恼怒的问题你需要手动给参数指定 现在,这些可以自动解决了。 除此之外,如果一个参数在route里面定义了,他会自动从先从path,也就是url上尝试绑定,不行的话会去从查询参数上绑定。 下面看代码: 如果你的action里面的一个参数指定了 不过这个也是可选的,只要你自己定义在action上定义一下 有两个注意点: 像MVC框架的大部分组件一样, 具体的设置是在startup方法里面通过 所有bool类型的属性默认都是false。Suppres有阻止的意思。可以通过以下方法进行设置。 来看一下 讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute 标签:第三方 style explorer 需要 div count spn 判断 json 原文地址:https://www.cnblogs.com/yan7/p/9503011.html转自:https://www.cnblogs.com/sheldon-lou/p/9495377.html
ApiControllerAttribute
. (注:文章是18年2月份的,所以文章提到了core2.1还没发布)。0. ApiControllerAttribute 继承自 ControllerAttribute
ApiControllerAttribute
是ControllerAttribute
的子类,所以,框架在处理Controller发现的时候和ControllerAttribute
标注的对象是一样的。ApiControllerAttribute
实现了IApiBehaviorMetadata
接口,所以提供了一些额外的特这些特性是以HTTP Api为出发点的。下面介绍一下这些特性。1. 自动模型状态验证
ModelState
.(注:不过我就是因为用FluentValidation的时候模型验证不管用了出问题了才找到这篇文章的).ModelStateInvalidFilter
,这个会运行在OnActionExecuting
事件里面(具体来说:在action执行之前,model绑定之后)。他内部会检查ModelState
是否为Valid,如果为InValid会直接返回400 BadRequest,这样就没有必要执行后面的代码,提高效率。application/problem+json
。当然你也可以自定义,因为毕竟你会有自己的验证,后文会讲。
[Route("[controller]")]
public class BookController : Controller
{
[HttpPost("")]
public IActionResult PostBook([FromBody]Book book)
{
if (ModelState.IsValid) //判断状态
{
return BadRequest(ModelState);
}
//其他代码。。。
}
}
[ApiController]
[Route("[controller]")]
public class BookController : Controller
{
[HttpPost("")]
public IActionResult PostBook(Book book)
{
//直接写,不用验证modelstate
}
}
ModelStateInvalidFilter
是个公共类,所以,不用ApiControllerAttribute
也可以使用它。2.参数绑定策略的自动推断
[FromBody]
这个特性,以便让系统知道如何从Request body里面反序列化他们,比如反序列化json。因此,写了很多第三方的库来解决这个问题,比如:
IFormFlie
默认从form表单上绑定获取。
[Route("[controller]")]
public class BookController : Controller
{
[HttpPost("")]
public IActionResult PostBook([FromBody]Book book)
{
// 写代码
}
}
[ApiController]
[Route("[controller]")]
public class BookController : Controller
{
[HttpPost("")]
public IActionResult PostBook(Book book)//FromBody没必要写了
{
// 写代码
}
}
3. 处理
multipart/form-data
请求[FromFile]
特性(这通常是用于文件上传的),框架会自动假设请求是multipart/form-data
。这个是用来解决社区里面提的这个问题。[Consumes(...)]
。4.其他
ApiExplorer
都是可见的,所以,不影响swagger 等的生成。[Route("XXX")]
的方式。5. 行为自定义
ApiControllerAttribute
的行为是高度可自定义的。首先,上面说的大部分内容都是可以简单的用 on/off 来切换。ApiBehaviorOptions
来实现,先来看一下这个类。 public class ApiBehaviorOptions
{
public Func InvalidModelStateResponseFactory { get; set; }
public bool SuppressModelStateInvalidFilter { get; set; }
public bool SuppressInferBindingSourcesForParameters { get; set; }
public bool SuppressConsumesConstraintForFormFileParameters { get; set; }
}
services.Configure(options =>
{
options.SuppressModelStateInvalidFilter = true;
options.SuppressConsumesConstraintForFormFileParameters = true;
});
InvalidModelStateResponseFactory
属性,他是一个返回IActionResult
的Func,通过他,我们可以注入自己的委托来实现需要的返回类型,举个例子。services.Configure(options =>
{
options.InvalidModelStateResponseFactory = actionContext =>
{
var errors = actionContext.ModelState
.Where(e => e.Value.Errors.Count > 0)
.Select(e => new Error
{
Name = e.Key,
Message = e.Value.Errors.First().ErrorMessage
}).ToArray();
return new BadRequestObjectResult(errors);
}
});
class Error
{
public string Name { get; set; }
public string Message { get; set; }
}
文章标题:讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute
文章链接:http://soscw.com/essay/67320.html