对外公开WEB接口时,对模型校验是常见的安全常识,常见的写法是在controller中判断ModelState.IsValid,以注册用户API为例。

Model:

public class RegisterCustomerModel
{
[Required(ErrorMessage = "姓名不能为空")]
[StringLength(,ErrorMessage = "姓名长度不能超过10个字")]
public string Name { get; set; } [Required(ErrorMessage = "电话不能为空")]
[RegularExpression(@"^1[34578]\d{9}$", ErrorMessage = "电话号码格式不正确")]
public string Phone { get; set; } [Required(ErrorMessage = "密码不能为空")]
[StringLength(, ErrorMessage = "密码长度不能超过48个字符")]
public string Password { get; set; } }

打印校验失败的错误消息代码:

public static class ModelStateExtension
{
public static string ToErrorMessage(this ModelStateDictionary modelStateDictionary)
{
var stringBuilder = new StringBuilder(); foreach (var value in modelStateDictionary.Values)
{
foreach (var error in value.Errors)
{
stringBuilder.AppendLine(error.ErrorMessage);
}
} return stringBuilder.ToString();
}
}

Controller:

public ResponseProtocol Register(RegisterCustomerModel registerCustomerModel)
{
if (!ModelState.IsValid)
{
return new ResponseProtocol((int)ResponseResultEnum.ValidateError, ModelState.ToErrorMessage(), string.Empty);
} Customer customer = new Customer
{
Name = registerCustomerModel.Name,
Phone = registerCustomerModel.Phone,
WeiXinNo = registerCustomerModel.WeiXinNo,
Company = registerCustomerModel.Company,
UpdateTime = DateTime.Now
}; _customerService.Add(customer); return new ResponseProtocol((int)ResponseResultEnum.Success, "注册成功", string.Empty);
}

  以上写法是在controller里进行校验,缺点是每个需要进行校验的controller都要写一次,为了消除重复,可以将校验代码写入全局过滤器中,由过滤器进行统一模型校验,修改后的代码:

public class ValidationModelFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
//get方法不进行模型校验
if (actionContext.Request.Method.Method=="GET")
{
return;
} if (!actionContext.ModelState.IsValid)
{
var error = JsonConvert.SerializeObject(new ResponseProtocol()
{
Code =(int)ResponseResultEnum.ValidateError,
Message = actionContext.ModelState.ToErrorMessage(),
Data = string.Empty
}); var httpResponseMessage = new HttpResponseMessage
{
Content = new StringContent(error)
}; httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
actionContext.Response = httpResponseMessage;
}
}
}

  然后在全局过滤器(WebApiConfig)注册一下: config.Filters.Add(new ValidationModelFilter());

ASP.NET WEB API 自定义模型校验过滤器的更多相关文章

  1. ASP.NET Web API 管道模型

    ASP.NET Web API 管道模型 前言 ASP.NET Web API是一个独立的框架,也有着自己的一套消息处理管道,不管是在WebHost宿主环境还是在SelfHost宿主环境请求和响应都是 ...

  2. ASP.NET Web API 自定义MediaType实现jsonp跨域调用

    代码来自<ASP.NET Web API 2 框架揭秘>一书. 直接上代码: /// <summary> /// 自定义jsonp MediaType /// </sum ...

  3. ASP.NET Web API编程——模型验证与绑定

    1.模型验证 使用特性约束模型属性 可以使用System.ComponentModel.DataAnnotations提供的特性来限制模型. 例如,Required特性表示字段值不能为空,Range特 ...

  4. ASP.NET Web API 自定义 HttpParameterBinding

    背景 问题的起因是这样的.群里面一个哥们儿发现在使用 ASP.NET WebAPI 时,不能在同一个方法签名中使用多次 FromBodyAttribute 这个 Attribute .正好我也在用 W ...

  5. ASP.NET Web API模型验证以及异常处理方式

    ASP.NET Web API的模型验证与ASP.NET MVC一样,都使用System.ComponentModel.DataAnnotations. 具体来说,比如有:[Required(Erro ...

  6. Asp.Net Web API 2第七课——Web API异常处理

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文主要来讲解Asp.Ne ...

  7. 【ASP.NET Web API教程】4.3 ASP.NET Web API中的异常处理

    原文:[ASP.NET Web API教程]4.3 ASP.NET Web API中的异常处理 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内 ...

  8. Asp.Net Web API(四)

    HttpResponseException-----HTTP响应异常 如果Web API控制器抛出一个未捕捉的异常,会发生什么呢?在默认情况下,大多数异常都会转换为一个带有状态码500的内部服务器错误 ...

  9. ASP.NET Web API 控制器创建过程(一)

    ASP.NET Web API 控制器创建过程(一) 前言 在前面对管道.路由有了基础的了解过后,本篇将带大家一起学习一下在ASP.NET Web API中控制器的创建过程,这过程分为几个部分下面的内 ...

随机推荐

  1. 升讯威微信营销系统开发实践:(5) Github 源码:微信接口的 .NET 封装。

    微信开发系列教程,将以一个实际的微信平台项目为案例,深入浅出的讲解微信开发.应用各环节的实现方案和技术细节. 本系列教程的最终目标是完成一个功能完善并达到高可用性能指标的微信管理软件,所以除了与微信本 ...

  2. zepto全选按钮之全选会根据按钮是否被全部选中更改状态

    在做手机端二次开发购物车的时候,发现zepto全选,没找到,或者功能不是自己想要的 后来做好,分享给需要的人 //全选或多选处理      var CheckAll = $('#items_check ...

  3. VR全景加盟-全景智慧城市携万千创业者决战BAT

    在所谓互联网思维走到末路.可穿戴设备基本昙花一现的大环境下,很多互联网人员转战VR市场,自然喜欢用互联网思维来考虑.笔者认识一些投资界人士,在谈到投资时,他们经常就问以下几句话:2B还是2C?将来有多 ...

  4. 字符串时间和NSDate相互转换的坑

    项目中服务器传回来的时间是这种格式的 Sep 5, 2016 6:59:05 PM 现在要将这段字符串转换成 2016-09-05 06:59 被坑的地方有2个点 服务器传回来的英文的Sep,调试的时 ...

  5. 10.Java 加解密技术系列之 DH

    Java 加解密技术系列之 DH 序 概念 原理 代码实现 结果 结束语 序 上一篇文章中简单的介绍了一种非对称加密算法 — — RSA,今天这篇文章,继续介绍另一种非对称加密算法 — — DH.当然 ...

  6. 002---第一个Hibernate示例

    Hibernate压缩文件结构 下载Hibernate压缩文档,下面为文件结构: Hibernate3.jar:为Hibernate的核心jar包: build.xml:重新打包配置文件 build. ...

  7. Java反射机制剖析(三)-简单谈谈动态代理

    通过Java反射机制剖析(一)和Java反射机制剖析(二)的学习,已经对反射有了一定的了解,这一篇通过动态代理的例子来进一步学习反射机制. 1.     代理模式 代理模式就是为其他对象提供一种代理来 ...

  8. 创建发布自己的npm包

    我们基于nodejs平台上面的npm上,可以随意下载很多npm安装包.那我们如何创建自己的npm包呢?很简单,废话少说,开始做~ 开始做之前nodejs默认是要安装的,怎么安装自行百度其他教程. 首先 ...

  9. 用户输入与while循环

    函数input()的工作原理: 函数input()让程序短暂运行,等待用户输入一些文本,获取用户输入后将其存储在一个变量中 测试input()功能-- #!/usr/bin/env python#fi ...

  10. JS闭包,以及适用场景

    闭包的定义 不用解释了,网上到处都是.简单的说:一个定义在函数内部的函数与包含它的外部函数构成了闭包,内部函数可以访问外部函数的变量,这些变量将一直保存在内存中,直到无法再引用这个内部函数 举个例子: ...