【接口验证】特性验证参数

介绍:

在我们实际项目中会经常进行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; }
       
    }
View Code

我们经常使用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);
            }

        }
    }
View Code

下面补全一个遍历验证的方法:

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")
                };
            }
View Code

这里会引用很多命名空间引用即可,没有别的。

配置注册:

第一种当然是在使用的方法方面直接加特性

第二种就是全局配置:在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;
        }
        
    }
View Code

 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;
                    }
                }
            }          

        }
View Code

这样子就跟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:可以对任何应用程序元素应用属性。

 

posted @ 2017-05-21 10:27  YanBigFeg  阅读(420)  评论(0编辑  收藏  举报