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


    介绍:

    在我们实际项目中会经常进行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:可以对任何应用程序元素应用属性。

    作者:YanBigFeg —— 颜秉锋

    出处:http://www.cnblogs.com/yanbigfeg

    本文版权归作者和博客园共有,欢迎转载,转载请标明出处。如果您觉得本篇博文对您有所收获,觉得小弟还算用心,请点击右下角的 [推荐],谢谢!

  • 相关阅读:
    JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
    JavaScript使用DeviceOne开发实战(三)仿微信应用
    JavaScript使用DeviceOne开发实战(二) 生成调试安装包
    生成器
    Python第一周的复习
    Ubuntu学习—-——第一课
    英 语 缩 写 (四)
    英语缩写(三)
    英语常用缩写(二)
    英语常用缩写(一)
  • 原文地址:https://www.cnblogs.com/yanbigfeg/p/9207579.html
Copyright © 2020-2023  润新知