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

简介: 介绍: 在我们实际项目中会经常进行post,get请求这些都避免不了一些参数,有参数就有合法有效的意思。比如我一个数就想保证几位,多了不允许,或者默写字段不可以为空值等。以前我们都是卸载方法中一个一个去判断,现在我们认识一个新朋友。

介绍:

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

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

目录
相关文章
|
3月前
|
存储 人工智能 自然语言处理
深度解析智能体工作流(Agentic Workflows):核心概念、模式与应用
本文系统解析智能体工作流(Agentic Workflow),结合AI智能体的推理、工具与记忆能力,实现复杂任务的动态执行。内容涵盖核心概念、关键模式及实际应用,帮助读者全面理解其价值与挑战。
2205 1
|
3月前
|
安全 API 数据安全/隐私保护
|
运维 Prometheus 监控
OceanBase 的运维与监控最佳实践
【8月更文第31天】随着分布式数据库解决方案的需求日益增长,OceanBase 作为一种高性能的分布式数据库系统,在众多场景下得到了广泛应用。为了确保 OceanBase 集群的稳定运行,合理的运维与监控是必不可少的。本文将探讨 OceanBase 的日常运维管理与监控策略,并提供相应的代码示例。
734 2
|
Cloud Native 关系型数据库 Linux
十年后数据库还是不敢拥抱NUMA-续篇
写这个续篇是我收到很多解释,因为跨Node 导致性能抖动,所以集团在物理机OS 的启动参数里设置了 numa=off ,也就是不管BIOS 中如何设置,我们只要在OS 层面设置一下 numa=off 就能让程序稳定下来不再抖了! 我这几年也认为这是对的,只是让我有点不理解,既然不区分远近了,那物理上存在的远近距离(既抖动)如何能被消除掉的呢? 所以这个续篇打算通过测试来验证下这个问题
|
JSON 数据可视化 定位技术
Map——使用BIGEMAP+geojson获取乡镇行政边界数据
Map——使用BIGEMAP+geojson获取乡镇行政边界数据
736 0
|
机器学习/深度学习 编解码 自然语言处理
一文综述 | 万字文总结,近几年都有哪些语义分割模型用了Transformer方法呢?
一文综述 | 万字文总结,近几年都有哪些语义分割模型用了Transformer方法呢?
1274 0
|
SQL 关系型数据库 MySQL
sqlite3自动插入创建时间和更新时间
在本文中,作者分享了如何在SQLite3中实现类似MySQL和Postgres的几个基本功能。首先,通过`AUTOINCREMENT`关键字设置了主键ID自增。接着,通过`DEFAULT (DATETIME(&#39;now&#39;, &#39;localtime&#39;))`确保了`created_at`在数据插入时自动获取当前时间。然而,`updated_at`在数据更新时不自动更新,为解决这个问题,作者创建了一个触发器(`trigger_position_info_updated_at`),在更新数据后自动更新`updated_at`字段。
344 0
【开发规范】UML类图
【1月更文挑战第27天】【开发规范】UML类图
|
存储 数据库 C语言
Hawkeyes: x86软件迁移Arm的弱内存序问题解决方案
本文介绍了x86软件迁移到Arm过程中可能遇到的弱内存序问题的解决方案,解析了弱内存序问题的根因,介绍了Hawkeyes的架构和实现原理。欢迎有需求的团队发送邮件咨询
2212 0
|
存储 XML Java
maven
maven
469 0