通常情况下,对于那些经常为别人提供数据接口的开发人员来说,对于调用方传递过来的参数都会有验证处理。例如:

  1. if (string.IsNullOrEmpty(entity.Name))
  2. {
  3. //当姓名为空时,.........
  4. }
  5. if (entity.Age<0 || entity.Age>100)
  6. {
  7. //当年龄小于0或大于100时,有的人可能超过一百岁,我希望我的有生之年Age>100,emm,.........
  8. }
  9.  
  10. if (string.IsNullOrEmpty(entity.PhoneNum))
  11. {
  12. //当电话号码为空时,.........
  13. }
  14. if (!string.IsNullOrEmpty(entity.PhoneNum))
  15. {
  16. Regex regex = new Regex("^1[34578]\\d{9}$");
  17. var result=regex.IsMatch(entity.PhoneNum);
  18. if (!result)
  19. {
  20. //当电话号码格式不合法时,.........
  21.  
  22. }
  23. }
  24. //以下还有50个字段需要验证,是不是有种绝望的感觉,有木有?有木有?有人可能会跟调用者说,某个字段必须怎么怎么样,有些人就喜欢故意传错,故意刁钻,到头来,最苦逼的还是写接口的人。

 有时候一个系统有十几二个接口,光验证的代码就一大堆,真的有时候不想写,都说程序猿是最聪明的一批人,自然有好的解决方法。

C# webapi 有一种叫模型验证的东西,在java里面,应该有一种注解的东西可以处理。

在ASP.NET Web API中,你可以使用System.ComponentModel.DataAnnotations命名空间的注解属性来设置模型属性的验证规则。考虑以下模型:

  1. public class Personnel
  2. {
  3. [Required(ErrorMessage = "Name参数不能为空")]//Required 验证这个参数不能为空 ErrorMessage:为空时自定义错误信息
  4. public string Name { get; set; }
  5.  
  6. [Range(1,100, ErrorMessage="Age参数只能是大于1,小于100")]//Range 验证值只能在某些范围内,只适用于Int类型的字段
  7. public int Age { get; set; }
  8.  
  9. [Required(ErrorMessage = "电话号不能为空")]
  10. [RegularExpression("^[1]+[3,4,5,7,8]+\\d{9}", ErrorMessage = "PhoneNum不合法的电话号码格式")]//RegularExpression 用正则验证字段的合法性,多用于身份证、电话号码、邮箱、等等...
  11. public string PhoneNum { get; set; }
  12. }

 这样的话就可以节省大量冗余代码,那么,接下来如何去处理呢?

在接口请求之前,我们可以对客户端传过来的数据进行模型验证处理,对于webapi比较熟悉的人应该知道过滤器,不知道的可以看我前面的文章,如何使用webapi三大过滤器,过滤器是基于AOP,面向切面的编程思想。

在这里我们用的ActionFilterAttribute过滤器,只要继承这个接口并且实现其中的OnActionExecuting方法就行。具体实现如下:

  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Net;
  4. using System.Net.Http;
  5. using System.Web.Http.Controllers;
  6. using System.Web.Http.Filters;
  7. using System.Web.Http.ModelBinding;
  8.  
  9. namespace Huajie.Application.Web.Controllers.Apis
  10. {
  11. public class ModeActionFilter: ActionFilterAttribute
  12. {
  13. /// <summary>
  14. /// 接口请求前验证数据
  15. /// </summary>
  16. /// <param name="actionContext">上下文</param>
  17. public override void OnActionExecuting(HttpActionContext actionContext)
  18. {
  19. if (actionContext.ModelState.IsValid == false)
  20. {
  21. // Return the validation errors in the response body.
  22. // 在响应体中返回验证错误信息
  23. var errors = new Dictionary<string, IEnumerable<string>>();
  24. foreach (KeyValuePair<string, ModelState> keyValue in actionContext.ModelState)
  25. {
  26. errors[keyValue.Key] = keyValue.Value.Errors.Select(e => e.ErrorMessage);
  27. }
  28. actionContext.Response =actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, new
  29. {
  30. code= HttpStatusCode.BadRequest,//返回客户端的状态码
  31. success = false,
  32. error = errors//显示验证错误的信息
  33. });
  34. }
  35. }
  36. }
  37. }

 在WebApiConfig.cs里面注册一下这个过滤器

  1. config.Filters.Add(new ModeActionFilter());

请求方法示例:

  1. [Route("test")]
  2. [HttpPost]
  3. public string Test([FromBody] Personnel entity )
  4. {
  5. return "成功!";
  6. }

接下来我们就是要postman接口测试工具就来看一下效果

提示的信息是不是很熟悉,对的,就是我们自定义的错误信息

给大家展示参数传递正确的效果

看到这里,是不是感觉又掌握了一点东西。

只要你肯去钻研,去折腾,你总会收获点什么!

webapi Model Validation 模型验证的更多相关文章

  1. Model Validation(模型验证)

    Model Validation(模型验证) 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/344 ...

  2. Asp.Net Web API 2第十五课——Model Validation(模型验证)

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文参考链接文章地址htt ...

  3. webapi中的模型验证

    mic: https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/model-valida ...

  4. JSR 303 - Bean Validation 模型验证

    类是转载的,不知道转的哪里的. 此类依赖 JSR 303 – Bean Validation, Hibernate Validator. 代码不能直接运行.意会一下.自己改改. import com. ...

  5. 在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)

    一.Forms认证 1.在webapi项目中启用Forms认证 Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证. What:什么是Forms认证?它在WebAP ...

  6. Web API中的模型验证

    一.模型验证的作用 在ASP.NET Web API中,我们可以使用 System.ComponentModel.DataAnnotations 命名空间中的属性为模型上的属性设置验证规则. 一个模型 ...

  7. Web API中的模型验证Model Validation

    数据注释 在ASP.NET Web API中,您可以使用System.ComponentModel.DataAnnotations命名空间中的属性为模型上的属性设置验证规则. using System ...

  8. 一、WebApi模型验证实践项目使用

    一.启语 前面我们说到,模型验证的原理(包含1.项目创建,2.模型创建,3.走通测试模型验证,4.在过滤器中处理返回json格式(非控制器内))-完全是新手理解使用的,新番理解 通常情况下,对于那些经 ...

  9. .Net高级进阶,WebApi和MVC进行模型验证的时候,教你如何自由控制需要进行验证的字段?

    现在,你有一个MVC架构的web项目,你要完成一个注册功能. 前台传了3个值到你的控制器,分别是账号.密码.邮箱. 如图:现在你要在控制器里面判断,账号名称.密码.邮箱不能为空,并且名称和密码不超过1 ...

随机推荐

  1. 渐进式 jpg 和 交错式 gif png 提高图片站体验

    渐进式 jpg 和 交错式 gif png 提高图片站体验= 渐进式的JPG比原始JPG还要小!! 让图片性感的露给你看~google picasa 和 smashing magazine 都有用到搞 ...

  2. Java toString()方法的神奇之处

    Java 手册 toString(String类中) public String toString() 返回此对象本身(它已经是一个字符串!). 指定者: 接口 CharSequence 中的 toS ...

  3. 20165233 实验二 Java面向对象程序设计

    20165233 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...

  4. Rhythmk 一步一步学 JAVA (18): Enum枚举学习

    枚举定义: public enum SizeEnum { SMALL, BIG, BIGEST }; public enum SizeStringEnum { SMALL("小") ...

  5. 使用http-proxy-middleware 代理跨域

    使用http-proxy-middleware 代理跨域 例如请求的url:“http://f.apiplus.cn/bj11x5.json” 1.打开config/index.js,在proxyTa ...

  6. Visual Basic 函数速查

    Calendar 常数 可在代码中的任何地方用下列常数代替实际值: 常数 值 描述 vbCalGreg 0 指出使用的是阳历. vbCalHijri 1 指出使用的是伊斯兰历法. Color 常数 可 ...

  7. c# 之 new 关键字

    1.实例化变量 DataTable dt  = new  DataTable(); 2.调用构造函数 class CoOrds { public int x, y; // 实例构造函数(默认构造函数) ...

  8. CentOS 多版本python安装pip

    首先配置环境 安装 zlib,zlib-devel,openssl,openssl-devel yum install zlib yum install zlib-devel yum install ...

  9. ELK Stack 5.2.2 安装文档

    简介: ELK Stack 安装文档,这次都使用最新版本(5.2.2).RPM 包的方式搭建 ELK Stack. 下载地址: https://artifacts.elastic.co/downloa ...

  10. 迷你MVVM框架 avalonjs 0.84发布

    本版本只要做了如下改进 重构ui绑定 fix scanTag bug ms-include 的值必须不为空值,否则不做任何操作.