aspnet core 全局模型验证,统一api响应
上手就来
新建一个模型验证过滤器,其中ApiResp是自定义的统一响应类。
public class VldFilter:IActionFilter
{
/// <summary>
/// 执行到action时
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
StringBuilder errTxt = new StringBuilder();
foreach (var item in context.ModelState.Values)
{
foreach (var error in item.Errors)
{
errTxt.Append(error.ErrorMessage + "|");
}
} // api响应报文,多封装几个构造方法,这里使用模型验证失败的响应码和模型校验信息
ApiResp result = new ApiResp(ApiRespCode.F400000, errTxt.ToString().Substring(0, errTxt.Length - 1));
context.Result = new JsonResult(result);
}
} public void OnActionExecuted(ActionExecutedContext context)
{
} }
ApiResp大概长这样,响应code使用自定义的枚举,从000000到999999,有足够的空间满足不同类型的响应码。
public class ApiResp
{
public bool Success; public string SysTime; public string Code; public string Message; public object Data;
}
在startup设置Mvc options
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.MaxModelValidationErrors = 5;
options.Filters.Add<VldFilter>();
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
写一个SayHello接口测试一下,然而返回数据并不是ApiResp类型,仍然是默认的返回类型。貌似并没有执行自定义过滤器。

将Api控制器改为MVC控制器,取消[ApiController]特性,并将继承类由ControllerBase改为Controller。

查看一下Controller与ControllerBase的差别,Controller有继承ControllerBase和IActionFilter,ControllerBase是一个基类,没有任何继承类。
正确姿势
在startup设置ApiBehaviorOptions,启用自定义模型验证。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.MaxModelValidationErrors = ;
options.Filters.Add<VldFilter>();
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true; // 使用自定义模型验证
}
}
得到正确的响应类

另一种正确姿势
直接在ApiBehaviorOptions中处理模型验证,并封装响应报文,不需要额外的VldFilter。但是这种方式只适用于WebApi项目,如果是MVC项目,还是使用自定义模型验证比较好。而且WebApi项目也支持自定义模型验证,不过需要设置ApiBehaviorOptions启用自定义模型验证。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.MaxModelValidationErrors = ;
//options.Filters.Add<VldFilter>();
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
// 实现统一模型验证,无须VldFilter。
services.Configure<ApiBehaviorOptions>(options =>
{
//options.SuppressModelStateInvalidFilter = true; // 使用自定义模型验证 options.InvalidModelStateResponseFactory = (context) =>
{
StringBuilder errTxt = new StringBuilder();
foreach (var item in context.ModelState.Values)
{
foreach (var error in item.Errors)
{
errTxt.Append(error.ErrorMessage + "|");
}
} ApiResp result = new ApiResp(ApiRespCode.F400000,errTxt.ToString().Substring(0,errTxt.Length-1));
return new JsonResult(result);
}; });
}
aspnet core 全局模型验证,统一api响应的更多相关文章
- asp.net core 2.1的全局模型验证统一方案
网上的统一模型验证,有效到asp.net core 2.0 2.1的mvc还可以用 webapi嘛,想想就好,自己琢磨了一顿,才发现这东西应该这样玩 首先吧api上面的特性注释了 //[ApiCont ...
- Asp.Net Core 全局模型验证
public class ActionFilter : IActionFilter { /// <summary> /// action 执行之前 /// </summary> ...
- asp.net core自定义模型验证——前端验证
转载请注明出处:http://www.cnblogs.com/zhiyong-ITNote/ 官方网站:https://docs.microsoft.com/zh-cn/aspnet/core/mvc ...
- .Net Core WebApi 模型验证无效时报400
问题 模型验证无效时,没有进入到接口里,而是直接报400 Bad Request,非常不友好. 环境 SDK:.Net Core 2.2.401 开发工具:VS2017 step 1 创建接口 /// ...
- asp.net core 简化模型验证 modelState.IsValid不用每一个写
第一种:直接在执行action之前验证模型 实现 IActionFilter public class ModelStateFilter : IActionFilter { public void O ...
- ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)
现阶段,基本上都是前后端分离项目,这样一来,就需要前后端配合,没有统一返回格式,那么对接起来会很麻烦,浪费时间.我们需要把所有接口及异常错误信息都返回一定的Json格式,有利于前端处理,从而提高了工作 ...
- .net core 中api 模型验证
AddControllers/AddMvc方法允许添加自定义ActionFilterAttribute进行过滤 文档中这么定义Filter: 可以创建自定义筛选器,用于处理横切关注点. 横切关注点的示 ...
- ASP.NET Core 添加统一模型验证处理机制
一.前言 模型验证自ASP.NET MVC便有提供,我们可以在Model(DTO)的属性上加上数据注解(Data Annotations)特性,在进入Action之前便会根据数据注解,来验证输入的数据 ...
- .Net Core Web Api使用模型验证验证参数合法性
在接口开发过程中免不了要去验证参数的合法性,模型验证就是帮助我们去验证参数的合法性,我们可以在需要验证的model属性上加上Data Annotations特性后就会自动帮我们在action前去验证输 ...
随机推荐
- matlab中x.^2与x^2有什么区别?
.^2是矩阵中的每个元素都求平方,^2是求矩阵的平方或两个相同的矩阵相乘,因此要求矩阵为方阵,且看下面的例子x=1:4x = 1 2 3 4 x.^2 ans = 1 4 9 16 x^2 Error ...
- PS 实用技巧
1. 调整大小 ctrl + T 2. 导出透明背景图片 选择 png格式
- java-mybaits-012-mybatis-Interceptor-拦截器读写分离四种实现方案
一.概述 基本项目搭建 技术框架:spring web mvc .日志[slf4j.log4j2].mybatis.druid.jetty插件启动.mybatis-generator逆向配置生产dao ...
- sehll变量比较
1.比较符号解释 $# 表示提供到shell脚本或者函数的参数总数: $1 表示第一个参数. -ne 表示 不等于 $?是shell变量,表示"最后一次执行命令"的退出状态.0为成 ...
- HttpRequest Get和Post调用其他页面的方法
HttpRequest Get和Post调用其他页面的方法,需要的朋友可以参考一下 //Get请求方式 private string RequestGet(string Url) { ...
- 【c# 学习笔记】为什么要使用委托
上一章中我们可能会很疑惑,为什么需要委托?为什么不直接在MyMethod方法里直接调用Add方法,反而要实例化一个委托对象来完成调用呢?这岂不是自找麻烦吗? 当然,c#引入委托并不是自找麻烦.委托是c ...
- selenium UI自动化解决验证码的五种方法
TesseractPy3.py #coding=utf-8 import os import subprocess import traceback import logging from PIL i ...
- Jenkins入坑记
记录一遍Jenkins初级使用教程 一,安装 (操作系统 centerOS7) 1-1.本次使用的是rpm包安装方式,在Jenkins官网下载rpm安装文件 下载地址: https://pkg.jen ...
- Unity3D 原来Unity比较新的版本支持中文
注意: Unity 2018.2 以上版本才可以
- 云计算服务模式(SaaS/PaaS/IaaS)
为什么是云计算,为什么是现在 商用云:商用云的设计初衷是将基础设施商品化,并以较低的成本对外提供,是用户能够获得高扩展性和自服务能力. 企业云:企业级云的目的,则是达到或超过它所要替代的本地基础设施的 ...