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

1.定义一个Person类

public class PersonDto
{
   public string Name { get; set; }

   public string Phone { get; set; }

   public int Age { get; set; }
}

Person类有三个属性,姓名,电话,年纪。

2.创建一个接口并以Person作为input参数并且返回input对象

public PersonDto Demo(PersonDto input)
{
    var str = string.Empty;
    PersonDto dto = new PersonDto
    {
      Name = input.Name,
      Age=input.Age,
      Phone=input.Phone,
     };
   return dto;
 }

3.用postman来调用这个接口  

    

很明显我传入的参数是不合法的,但是接口依旧执行了。 那怎么去验证参数的合法性呢?在接口里面写if吗?这时候模型验证就发挥作用啦。

4.修改之前的Person类,引入using System.ComponentModel.DataAnnotations;

public class PersonDto
    {
        [Required(ErrorMessage = , ErrorMessage = , ErrorMessage = "名字太短")]
       [ RegularExpression(@"^[\u4e00-\u9fa5]+$", ErrorMessage = "姓名必须是中文")]
        public string Name { get; set; }

        [Required(ErrorMessage = "手机号码不能为空"), RegularExpression(@"^\+?\d{0,4}?[1][3-8]\d{9}$", ErrorMessage = "手机号码格式错误")]
        public string Phone { get; set; }

        [Range(, , ErrorMessage = "年纪必须在0-99之间")]
        public int Age { get; set; }
    }

在次调用这个接口。

    

     如果参数参数的不合法会直接400且会根据定义的提示去提示前端参数哪里不合法。但是很多小伙伴的返回值都是通用的,怎么把这些提示放到自己的通用返回值里面呢?

5.定义一个通用的返回值

    public class ResponseDto
    {/// <summary>
        /// 详细错误信息
        /// </summary>
        public string message { get; set; }

        /// <summary>
        /// 具体业务参数
        /// </summary>
        public object data { get; set; }
    }

6.定义一个CustomResultFilter

public class CustomResultFilter : ActionFilterAttribute
    {
        public override void OnResultExecuting(ResultExecutingContext context)
        {

            if (!context.ModelState.IsValid)
            {
                ResponseDto result = new ResponseDto();

                foreach (var item in context.ModelState.Values)
                {
                    foreach (var error in item.Errors)
                    {
                        result.message += error.ErrorMessage + ",";
                        result.data = "{}";
                    }
                }
                result.message = result.message.TrimEnd(',');
                context.Result = new JsonResult(result);
            }
            else
            {
                var result = context.Result as ObjectResult ?? null;
                context.Result = new OkObjectResult(new ResponseDto
                {
                    message = "成功",
                    data = result == null ? "{}" : result.Value
                });
                base.OnResultExecuting(context);

            }
        }

        public override void OnActionExecuting(ActionExecutingContext context)
        {
        }

使用ModelState.IsValid来判断模型验证是否通过。

7.配置过滤器

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc(options =>
            {
                options.Filters.Add(typeof(CustomResultFilter));
            }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.AddSwaggerGen(options =>
            {
                options.SwaggerDoc("v1", new Info
                {
                    Title = " API",
                    Version = "v1",
                    Description = "RESTful API",
                    TermsOfService = " Service",
                    Contact = new Contact { Name = "", Email = "", Url = "" }
                });
            });
        }

  8.测试

  

   模型验证通过

  

.Net Core Web Api使用模型验证验证参数合法性的更多相关文章

  1. 使用JWT创建安全的ASP.NET Core Web API

    在本文中,你将学习如何在ASP.NET Core Web API中使用JWT身份验证.我将在编写代码时逐步简化.我们将构建两个终结点,一个用于客户登录,另一个用于获取客户订单.这些api将连接到在本地 ...

  2. ASP.NET Core Web API + Angular 仿B站(三)后台配置 JWT 的基于 token 的验证

    前言: 本系列文章主要为对所学 Angular 框架的一次微小的实践,对 b站页面作简单的模仿. 本系列文章主要参考资料: 微软文档: https://docs.microsoft.com/zh-cn ...

  3. .net core web API使用Identity Server4 身份验证

    一.新建一个.net core web项目作为Identity server 4验证服务. 选择更改身份验证,然后再弹出的对话框里面选择个人用户账户. nuget 安装Identity server相 ...

  4. ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程

    ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程 翻译自:地址 在今年年初,我整理了有关将JWT身份验证与ASP.NET Core Web API和Angular一起使用的详 ...

  5. .NET Core WEB API中接口参数的模型绑定的理解

    在.NET Core WEB API中参数的模型绑定方式有以下表格中的几种: 微软官方文档说明地址:https://docs.microsoft.com/zh-cn/aspnet/core/web-a ...

  6. ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

    在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...

  7. NET Core Web API下事件驱动型架构CQRS架构中聚合与聚合根的实现

    NET Core Web API下事件驱动型架构在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件 ...

  8. ASP.NET Core Web API 最佳实践指南

    原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...

  9. [转]ASP.NET Core Web API 最佳实践指南

    原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 转自 介绍# 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但 ...

随机推荐

  1. NOIP模拟 20

    来自liu_runda的善意 T1 周 究级难题,不可做,咕了. T2  任 他为什么总强调没环啊? 他为什么总强调没环啊? 他为什么总强调没环啊? ...... QAQ 因为他总是棵树,所以点的数量 ...

  2. 建议收藏备用:.net core使用QRCoder生成普通二维码和带Logo的二维码详细使用教程,源码已更新至开源模板

    随着互联网越来越生活化,二维码的使用越来越普遍,不论是扫码支付还是扫码关注引流,似乎我们总是离不开二维码,那么很多需要推广的文章或社区想要自己的二维码,那么你是不是需要在网站直接提供给用户呢?很多开发 ...

  3. 1. 彤哥说netty系列之开篇(有个问卷调查)

    你好,我是彤哥,本篇是netty系列的第一篇. 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识. 简介 本文主要讲述netty系列的整体规划,并调查一下大家喜欢的学习方式. 知识点 ne ...

  4. 03-MyBatis拦截器机制

    目录 MyBatis拦截器介绍 拦截器的使用 拦截器介绍及配置 源码分析 总结 本文转载自MyBatis拦截器原理探究 MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽 ...

  5. ASP.NET Core 1.0: Deploy to IIS

    尽管ASP.NET最新的官方文档记录了如何Deploy to IIS,但是实际操作起来依旧磕磕绊绊.官方文档地址:https://docs.asp.net/en/latest/publishing/i ...

  6. [LC]203题 Remove Linked List Elements (移除链表元素)(链表)

    ①英文题目 Remove all elements from a linked list of integers that have value val. Example: Input: 1-> ...

  7. Netty学习篇⑤--编、解码

    前言 学习Netty也有一段时间了,Netty作为一个高性能的异步框架,很多RPC框架也运用到了Netty中的知识,在rpc框架中丰富的数据协议及编解码可以让使用者更加青睐: Netty支持丰富的编解 ...

  8. 力扣(LeetCode)两数相加 个人题解

    给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  9. 更换JDK

    1.更换JDK 1).卸载原有jdk 检查一下系统中的jdk版本 java -version 显示 java version "1.6.0_24" OpenJDK Runtime ...

  10. Ubuntu 16.04源码编译boost库 编写CMakeLists.txt | compile boost 1.66.0 from source on ubuntu 16.04

    本文首发于个人博客https://kezunlin.me/post/d5d4a460/,欢迎阅读! compile boost 1.66.0 from source on ubuntu 16.04 G ...