·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> 数据验证随想(续)

数据验证随想(续)

作者:佚名      ASP.NET网站开发编辑:admin      更新时间:2022-07-23

数据验证随想(续)

梳理需求

  关于这个想法,想看看历史背景的,请移步 《数据验证随想》

  今天要说的是这个组件在项目中的应用,以及后期对它的改善。在原来的想法中,希望做的大而全,结果越往后做,发现有点过度设计,写完代码后,楼主自己都懒得用。与其这么麻烦,还不如直接几个 if 判断完事。

  既然如此,只能将问题简单化。认真梳理一下楼主的需求:

  1. 部分参数是必需的,验证失败,中断,并返回该错误信息。

  2. 部分参数是非必需的。验证失败就直接忽略。这个需求来自于,表单里部分值是可以空的,或者传递了意外的值,试图忽略它。

  3. 验证成功后的参数,最好是能直接使用,而且类型都是转换后的。

解决方案

  先看看代码上是怎么调用的。

            var v = ValidateHelp.BeginEntity<PumpCodeEntity>()                .IsNullOrEmpty(form["tybh"], "统一编号", "未找到需要修改的数据")                .IsInt(form["zldm"], "指令代码", "指令代码错误")                .IsInt(form["sfyx"], "是否有效", "有效指令错误");            if (v.IsInValid) //数据无效            {                return new ResultDTO() { Message = v.Message};            }            ......

  其中form是MVC的FormCollection对象,没用过的理解成HttPRequest也成。

  PumpCodeEntity 是实体对象,呃,其中 “统一编号、指令代码、是否有效” 是这个对象的属性。为什么它会是中文,这个有项目背景,重点不是它啦。

  大家可以看到,其中有3个验证方法,方法带有3个参数,分别是:

  待验证的值

  Key名或属性名(验证成功存储在Dictionary中, 或通过反射存储在对象中)

  错误消息提示 当未传递错误信息参数时,表示当前验证的参数是非必需的。由于在验证参数时,尝试对参数做了类型转换,故验证成功后,参数的类型是正确的,将参数存储到Dictionary<string,object>中,或者是对象的属性中。

  因此增加检测条件时,只需要增加一个类型的判断方法即可。代码中已经内置了检测整数、浮点数、双精度、时间、正则等。

  详细代码如下:

  1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using System.Text.RegularExpressions;  6 using CheckHandle = System.Func<Core.Data.ValidateHelp, string, string, string, Core.Data.ValidateHelp>;  7 namespace Core.Data  8 {  9     public class ValidateHelp 10     { 11         #region 属性 12         //数据容器字典 13         public Dictionary<string, object> Data { get; protected set; } 14         //数据容器实体 15         public Object Entity { get; protected set; } 16         //错误信息 17         public string Message { get; protected set; } 18         /// <summary> 19         /// true:数据无效 false:数据有效 20         /// </summary> 21         private bool isInValid; 22         /// <summary> 23         /// true:数据无效 false:数据有效 24         /// </summary> 25         public bool IsInValid { get { return isInValid; } } 26         #endregion 27  28         #region 字段 29  30         //数据容器实体类型 31         protected Type EntityType; 32         //验证委托缓存 33         private static Dictionary<string, CheckHandle> checkHandlers = new Dictionary<string, CheckHandle>(); 34  35         #endregion 36  37         #region 静态方法 得到对象实例 38         public static ValidateHelp Begin() 39         { 40             var v = new ValidateHelp(); 41             v.Data = new Dictionary<string, object>(); 42             return v; 43         } 44  45         public static ValidateHelp BeginEntity<T>() 46         { 47             var v = new ValidateHelp(); 48             v.EntityType = typeof(T); 49             v.Entity = Activator.CreateInstance(v.EntityType); 50             return v; 51         } 52         #endregion 53  54         #region 私有辅助方法 55         private ValidateHelp() 56         { 57         } 58  59  60         private static ValidateHelp Error(ValidateHelp v, string msg) 61         { 62             //没有错误信息 默认不修改验证结果 63             if (msg == null || msg.Length == 0) 64             { 65                 return v; 66             } 67             v.isInValid = true; 68             v.Message = msg; 69             return v; 70         } 71  72         private static ValidateHelp Success(ValidateHelp v, object value, string propertyName) 73         { 74             if (v.IsInValid) return v; 75             if (propertyName != null && propertyName.Length > 0) 76             { 77                 if (v.Data != null) 78                 { 79                     v.Data[propertyName] = value; 80                 } 81                 else if (v.Entity != v) 82                 { 83                     var p = v.Entity.GetType().GetProperty(propertyName); 84                     //为对象属性赋值 85                     p.SetValue(v.Entity, value, null); 86                 } 87             } 88             return v; 89         } 90  91         private ValidateHelp Check(string[] args, CheckHandle fun) 92         { 93             if (args == null || args.Length == 0 || args.Length > 3) 94             { 95                 throw new Exception("验证参数错误"); 96             } 97             //如果之前验证失败,就直接返回 98             if (isInValid) return this; 99             var value = args[0];100             var propertyName = args.Length > 1 ? args[1] : null;101             var msg = args.Length > 2 ? args[2] : null;102             return fun(this, value, propertyName, msg);103         }104 105         #endregion106 107         #region 公有辅助方法108         public object this[string key]109         {110             get111             {112                 object o;113                 if (Data.TryGetValue(key, out o)) return o;114                 return null;115             }116         }117         #endregion118 119         #region 验证方法120         public virtual ValidateHelp IsNullOrEmpty(params string[] args)121         {122             CheckHandle handler;123             if (!checkHandlers.TryGetValue("IsNullOrEmpty", out handler))124             {125                 handler = (scope, s, p, m) =>126                 {127                     if (s == null || s.Length == 0)128                     {129                         return Error(scope, m);130                     }131                     return Success(scope, s, p);132                 };133                 checkHandlers["IsNullOrEmpty"] = handler;134             };135             return Check(args, handler);136         }137         public virtual ValidateHelp IsInt(params string[] args)138         {139             CheckHandle handler;140             if (!checkHandlers.TryGetValue("IsInt", out handler))141             {142                 handler = (scope, s, p, m) =>143                 {144                     int i;145                     if (!int.TryParse(s, out i))146                     {147                         return Error(scope, m);148                     }149                     return Success(scope, i, p);150                 };151                 checkHandlers["IsInt"] = handler;152             };153             return Check(args, handler);154         }155 156         public virtual ValidateHelp IsDouble(params string[] args)157         {158             CheckHandle handler;159             if (!checkHandlers.TryGetValue("IsDouble", out handler))160             {161                 handler = (scope, s, p, m) =>162                 {163                     double i;164                     if (!double.TryParse(s, out i))165                     {166                         return Error(scope, m);167                     }168                     return Success(scope, i, p);169                 };170                 checkHandlers["IsDouble"] = handler;171             };172             return Check(args, handler);173         }174 175         public virtual ValidateHelp IsLong(params string[] args)176         {177             CheckHandle handler;178             if (!checkHandlers.TryGetValue("IsLong", out handler))179             {180                 handler = (scope, s, p, m) =>181                 {182                     long i;183                     if (!long.TryParse(s, out i))184                     {185                         return Error(scope, m);186                     }187                     return Success(scope, i, p);188                 };189                 checkHandlers["IsLong"] = handler;190             };191             return Check(args, handler);192         }193 194         public virtual ValidateHelp IsFloat(params string[] args)195         {196             Che