【接口验证】特性验证参数
介绍:
在我们实际项目中会经常进行post,get请求这些都避免不了一些参数,有参数就有合法有效的意思。比如我一个数就想保证几位,多了不允许,或者默写字段不可以为空值等。以前我们都是卸载方法中一个一个去判断,现在我们认识一个新朋友。
此文章不说多深就是一个简单使用记录,所有还请见谅,大神绕行!!!!
数据注解Data Annotations:
首先:Data Annotations是在System.ComponentModel.DataAnnotations命名空间下:所有我们使用要先引用命名空间:
该命名空间下有很多帮助类:
!!!!!!!!!有时间补充!!!!!!
代码示例:
首先定义参数接受类:
public class ParameClass { public int Id { get; set; } [Required(ErrorMessage="请输入姓名")] public string Name { get; set; } [Range(0, 10)] public double value { get; set; } }
我们经常使用mvc对Required特性最熟悉了,没有错我就是定一个name属性为必填项,定义一个value为0-10位;Range(minimum,maximum)很好理解。
好了定义好了参数类,我们就开始定一个特性类来对参数的有效性做处理:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method , Inherited = true)] public class ValiDateAttribute : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { if (actionContext.ModelState.IsValid == false) { actionContext.Response = actionContext.Request.CreateErrorResponse( HttpStatusCode.BadRequest, actionContext.ModelState); } } }
下面补全一个遍历验证的方法:
var modelState = actionContext.ModelState; if (!modelState.IsValid) { string error = string.Empty; foreach (var key in modelState.Keys) { var state = modelState[key]; if (state.Errors.Any()) { error = state.Errors.First().ErrorMessage; break; } } var response = new{ Status = 404, Message = error }; actionContext.Response = new HttpResponseMessage(HttpStatusCode.Accepted) { Content = new StringContent(JsonConvert.SerializeObject(response), System.Text.Encoding.GetEncoding("UTF-8"), "application/json") }; }
这里会引用很多命名空间引用即可,没有别的。
配置注册:
第一种当然是在使用的方法方面直接加特性
第二种就是全局配置:在WebApiConfig文件的Register方法里面注册:
//注册验证 config.Filters.Add(new ValiDateAttribute());
效果:
注意:注意:注意:在webAPI中必须请求加上参数参可以看到效果,不然一直是默认值,不会验证,还没想到解决办法。
好了这就是简单使用步骤。在mvc控制器我还没有弄,以后弄了会补上!!!!!!!
补充:2018-06-21
一些验证规则:
Required(ErrorMessage):必须输入值;ErrorMessage ="";用来定义返回的说明
StringLength(value):字符长度;存在:ErrorMessage
Range(min,max):字符范围;存在:ErrorMessage
RegularExpression:允许输入正则表达式存在:ErrorMessage
自定义实现规则写法:
首先肯定是要继承:ValidationAttribute (当然也可以继承子类)
注意:如果继承父类,要实现自定义验证方法,不然运行会报错:
实例代码:
public class CustomAttribute : ValidationAttribute { //构造函数 public CustomAttribute() { } //错误返回值 public override string FormatErrorMessage(string name) { return "只能输入男或者女"; } //验证重写【规则】 public override bool IsValid(object value) { if (value.ToString() == "男" || value.ToString() == "女") { return true; } return false; } }
mvc移植:
在mvc中直接使用是不好使用的,因为使用的命名空间不一样可能是,但是方法不同吧,没细研究,我使用了一个折中的方式来实现(以后在发现在补充):
就是在mvc中我这这个方法中直接获取参数名称,然后对参数名称的值取出来进行验证,所有所有的验证不是写在了实体类上面,而是写在了这个方法中:
public override void OnActionExecuting(ActionExecutingContext actionContext) { var parames = actionContext.ActionParameters; foreach (var key in parames.Keys) { if (key == "name") { var state = parames[key]; if (string.IsNullOrEmpty(state.ToString())) { JsonResult ajaxRes = new JsonResult(); ajaxRes.JsonRequestBehavior = JsonRequestBehavior.AllowGet; ajaxRes.Data = "请输入名称"; actionContext.Result = ajaxRes; } } if (key == "age") { var state = parames[key]; if ((int)state<0|| (int)state>10) { JsonResult ajaxRes = new JsonResult(); ajaxRes.JsonRequestBehavior = JsonRequestBehavior.AllowGet; ajaxRes.Data = "请输入年龄0-10"; actionContext.Result = ajaxRes; } } if (key == "sex") { var state = parames[key]; if (state.ToString() == "男" || state.ToString() == "女") { } else { JsonResult ajaxRes = new JsonResult(); ajaxRes.JsonRequestBehavior = JsonRequestBehavior.AllowGet; ajaxRes.Data = "请输入男或者女"; actionContext.Result = ajaxRes; } } } }
这样子就跟Data Annotations这个没有关系了,不管怎么样先实现这个类似的效果仅作记录笔记吧。使用和特新一样用,写在方法上面即可。
特性使用范围补充:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method , Inherited = true)]
AttributeUsageAttribute(AttributeTargets validOn);:用指定的属性允许多个来指定该特性适用于那些。比如类,方法,程序集。
AttributeTargets:枚举类型,包含了AttributeUsageAttribute所运行的属性值。
Assembly = 1:可以对程序集应用属性
Module = 2:可以对模块应用属性。
Class = 4:可以对类应用属性。
Struct = 8:可以对结构应用属性,即值类型。
Enum = 16,可以对枚举应用属性
Constructor = 32:可以对构造函数应用属性。
Method = 64:可以对方法应用属性。
Property = 128:可以对属性 (Property) 应用属性 (Attribute)。
Field = 256:可以对字段应用属性。
Event = 512:可以对事件应用属性。
Interface = 1024,可以对接口应用属性。
Parameter = 2048:可以对参数应用属性。
Delegate = 4096:可以对委托应用属性。
ReturnValue = 8192:可以对返回值应用属性。
GenericParameter = 16384:可以对泛型参数应用属性。
All = 32767:可以对任何应用程序元素应用属性。
作者:YanBigFeg —— 颜秉锋
出处:http://www.cnblogs.com/yanbigfeg
本文版权归作者和博客园共有,欢迎转载,转载请标明出处。如果您觉得本篇博文对您有所收获,觉得小弟还算用心,请点击右下角的 [推荐],谢谢!