aspnet core 全局模型验证,统一api响应
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了aspnet core 全局模型验证,统一api响应,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2739字,纯文字阅读大概需要4分钟。
内容图文
上手就来
新建一个模型验证过滤器,其中ApiResp是自定义的统一响应类。
public class VldFilter:IActionFilter { /// <summary> /// 执行到action时 /// </summary> /// <param name="context"></param> public void OnActionExecuting(ActionExecutingContext context) { if (!context.ModelState.IsValid) { ApiResp result = new ApiResp(ApiRespCode.F400000) { }; StringBuilder errTxt = new StringBuilder(); foreach (var item in context.ModelState.Values) { foreach (var error in item.Errors) { errTxt.Append(error.ErrorMessage + "|"); } } if(errTxt.Length>0) { result.Message= errTxt.ToString().Substring(0, errTxt.Length - 1); } context.Result = new JsonResult(result); } } publicvoid 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 = 5; options.Filters.Add<VldFilter>(); }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.Configure<ApiBehaviorOptions>(options => { options.SuppressModelStateInvalidFilter = true; // 使用自定义模型验证 } }
得到正确的响应类
另一种正确姿势
这样设置,不需要额外的VldFilter。
public void ConfigureServices(IServiceCollection services) { services.AddMvc(options => { options.MaxModelValidationErrors = 10; //options.Filters.Add<VldFilter>(); }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2); // 实现统一模型验证,无须VldFilter。 services.Configure<ApiBehaviorOptions>(options => {
//options.SuppressModelStateInvalidFilter = true; // 使用自定义模型验证 options.InvalidModelStateResponseFactory = (context) => { ApiResp result = new ApiResp(ApiRespCode.F400000) { }; StringBuilder errTxt = new StringBuilder(); foreach (var item in context.ModelState.Values) { foreach (var error in item.Errors) { errTxt.Append(error.ErrorMessage + "|"); } } if (errTxt.Length > 0) { result.Message = errTxt.ToString().Substring(0, errTxt.Length - 1); } returnnew JsonResult(result); }; }); }
原文:https://www.cnblogs.com/fallTakeMan/p/11668118.html
内容总结
以上是互联网集市为您收集整理的aspnet core 全局模型验证,统一api响应全部内容,希望文章能够帮你解决aspnet core 全局模型验证,统一api响应所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。