上手就来

新建一个模型验证过滤器,其中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。

  查看一下ControllerControllerBase的差别,Controller有继承ControllerBaseIActionFilterControllerBase是一个基类,没有任何继承类。

正确姿势

在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响应的更多相关文章

  1. asp.net core 2.1的全局模型验证统一方案

    网上的统一模型验证,有效到asp.net core 2.0 2.1的mvc还可以用 webapi嘛,想想就好,自己琢磨了一顿,才发现这东西应该这样玩 首先吧api上面的特性注释了 //[ApiCont ...

  2. Asp.Net Core 全局模型验证

    public class ActionFilter : IActionFilter { /// <summary> /// action 执行之前 /// </summary> ...

  3. asp.net core自定义模型验证——前端验证

    转载请注明出处:http://www.cnblogs.com/zhiyong-ITNote/ 官方网站:https://docs.microsoft.com/zh-cn/aspnet/core/mvc ...

  4. .Net Core WebApi 模型验证无效时报400

    问题 模型验证无效时,没有进入到接口里,而是直接报400 Bad Request,非常不友好. 环境 SDK:.Net Core 2.2.401 开发工具:VS2017 step 1 创建接口 /// ...

  5. asp.net core 简化模型验证 modelState.IsValid不用每一个写

    第一种:直接在执行action之前验证模型 实现 IActionFilter public class ModelStateFilter : IActionFilter { public void O ...

  6. ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)

    现阶段,基本上都是前后端分离项目,这样一来,就需要前后端配合,没有统一返回格式,那么对接起来会很麻烦,浪费时间.我们需要把所有接口及异常错误信息都返回一定的Json格式,有利于前端处理,从而提高了工作 ...

  7. .net core 中api 模型验证

    AddControllers/AddMvc方法允许添加自定义ActionFilterAttribute进行过滤 文档中这么定义Filter: 可以创建自定义筛选器,用于处理横切关注点. 横切关注点的示 ...

  8. ASP.NET Core 添加统一模型验证处理机制

    一.前言 模型验证自ASP.NET MVC便有提供,我们可以在Model(DTO)的属性上加上数据注解(Data Annotations)特性,在进入Action之前便会根据数据注解,来验证输入的数据 ...

  9. .Net Core Web Api使用模型验证验证参数合法性

    在接口开发过程中免不了要去验证参数的合法性,模型验证就是帮助我们去验证参数的合法性,我们可以在需要验证的model属性上加上Data Annotations特性后就会自动帮我们在action前去验证输 ...

随机推荐

  1. pytorch常用normalization函数

    参考:https://blog.csdn.net/liuxiao214/article/details/81037416 归一化层,目前主要有这几个方法,Batch Normalization(201 ...

  2. ORA-00911: invalid character 错误解决集锦

    转: ORA-00911: invalid character 错误解决集锦 参考https://www.linuxidc.com/Linux/2017-05/144361.htm ORA-00911 ...

  3. 编译freeglut

    下载freeglut  http://freeglut.sourceforge.net/ 1>------ 已启动生成: 项目: CallbackMaker, 配置: Debug x64 --- ...

  4. selenium chromedriver与chrome版本对应表

    chromedriver版本   支持的Chrome版本 v2.41               v67-69 v2.40               v66-68 v2.39             ...

  5. fiddler https 抓包

    手机上https抓包: http://blog.csdn.net/wangjun5159/article/details/52202059 需要给fiddler安装插件CertMaker for iO ...

  6. AWS 云产品 CloudFront + ELB + EC2 + S3 构建虚拟主机动+静分离站点

    目录 一.架构图 二.实现步骤 2.1.EC2 配置 2.2.ELB 设置 2.2.1.创建目标组 2.2.2.创建负载均衡器 2.3.S3 设置 2.4.CloudFront 分配 2.4.1.创建 ...

  7. vue等单页面应用及其优缺点

    优点: Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件,核心是一个响应的数据绑定系统.MVVM.数据驱动.组件化.轻量.简洁.高效.快速.模块友好. 缺点: 不支持低版本 ...

  8. 《Fluid Engine Development》 学习笔记4-预测校正不可压缩SPH-PCISPH

    传统SPH方案的主要问题之一是时间步长限制.在原始的SPH中,我们首先从当前设置计算密度,使用EOS计算压强,应用压力梯度,然后运行时间积分.这个过程意味着只需要一定的压缩量就可以触发内核半径内的压力 ...

  9. [转载]DriverStore文件夹特别大,能删除吗?

    [转载]DriverStore文件夹特别大,能删除吗? 转自博客园https://www.cnblogs.com/lovebing/p/6951833.html 这篇文章,清理完C盘多了20G!不要太 ...

  10. Stream入门及Stream在JVM中的线程表现

    继上次学习过Java8中的非常重要的Lambda表达式之后,接下来就要学习另一个也比较重要的知识啦,也就如标题所示:Stream,而它的学习是完全依赖于之前学习的Lambda表达式. 小实验引入: 这 ...