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

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

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

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

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

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

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

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

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

using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.Web.Http.ModelBinding; namespace Huajie.Application.Web.Controllers.Apis
{
public class ModeActionFilter: ActionFilterAttribute
{
/// <summary>
/// 接口请求前验证数据
/// </summary>
/// <param name="actionContext">上下文</param>
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid == false)
{
// Return the validation errors in the response body.
// 在响应体中返回验证错误信息
var errors = new Dictionary<string, IEnumerable<string>>();
foreach (KeyValuePair<string, ModelState> keyValue in actionContext.ModelState)
{
errors[keyValue.Key] = keyValue.Value.Errors.Select(e => e.ErrorMessage);
}
actionContext.Response =actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, new
{
code= HttpStatusCode.BadRequest,//返回客户端的状态码
success = false,
error = errors//显示验证错误的信息
});
}
}
}
}

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

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

请求方法示例:

        [Route("test")]
[HttpPost]
public string Test([FromBody] Personnel entity )
{
return "成功!";
}

接下来我们就是要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. 纯php实现中秋博饼游戏(2):掷骰子并输出结果

    这篇是纯php实现中秋博饼游戏系列博文(2) 上文是:纯php实现中秋博饼游戏(1):绘制骰子图案 http://www.cnblogs.com/zqifa/p/php-dice-1.html要纯ph ...

  2. SQL Server 查询优化器运行方式

    一.结合实际,谈索引使用的误区 理论的目的是应用.虽然我们刚才列出了何时应使用聚集索引或非聚集索引,但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析.下面我们将根据在实践中遇到的实际问题 ...

  3. 【android】SDK环境变量配置

    Android SDK: Android SDK提供了你的API库和开发工具构建,测试和调试应用程序,Android.简单来讲,Android SDK 可以看做用于开发和运行Android应用的一个软 ...

  4. 建立SSH隧道从外网访问内网服务器

    http://blog.trackets.com/2014/05/17/ssh-tunnel-local-and-remote-port-forwarding-explained-with-examp ...

  5. Java 字符串 String

    什么是Java中的字符串 在 Java 中,字符串被作为 String 类型的对象处理. String 类位于 java.lang 包中.默认情况下,该包被自动导入所有的程序. 创建 String 对 ...

  6. PAT 甲级 1009 Product of Polynomials (25)(25 分)(坑比较多,a可能很大,a也有可能是负数,回头再看看)

    1009 Product of Polynomials (25)(25 分) This time, you are supposed to find A*B where A and B are two ...

  7. 九jQuery源码解析之.each()

    jQuery中存在两个each方法都是用于遍历的, 一个是对jQuery对象集合使用.each(),用于遍历这个集合; .each(function(index,element)) 还有一个是扩展jQ ...

  8. solr之高级查询--联表 join查询

    例如有两个业务表:文章表,评论表 . 场景: 一个文章可以由多个人评论. 创建两个core,一个core叫article,一个叫comment.article实例的schema.xml文件中定义几个简 ...

  9. Python开发之用户密码存储

    在各种线上应用中,用户名密码是用户身份认证的关键,它的重要性不言而喻.一方面,作为保护用户敏感数据的钥匙来说,一旦被破解,系统将敞开大门完全不设防.另一方面,密码这把钥匙本身就是非常敏感的数据:大多数 ...

  10. Spring MVC 学习 之 - 配置简单demo

    1.环境参数: Maven:3.1.1 JDK  :1.6 2.项目文件结构图: 3.各文件配置: 3.1. pom.xml <project xmlns="http://maven. ...