浅谈.net的后台校验

1.场景描述

     在开发中,前端的相关模型校验往往不能满足当前开发的需求,也就是并不是十分的安全。于是,很多情况下需要后端进行模型的校验。在.net mvc中,有很多校验的方式(比如:值(1)可以使用内置的标签的校验模式,.net中内置诸如Require/Range/Phone等校验标签,只需在相应的模型字段上打上对应的标签,在相应的Action内使用ModelState.IsVaild便可以进行校验;(2)使用FluentValidation插件(具体的使用查一下文档即可,也比较简单))。本文先抛开这两款校验组件,使用.net 提供的ValidationContext完成自定义的扩展校验。废话不说,直接上代码。

2.代码分享交流

     

 1 public class ValidContext
 2     {
 3         /// <summary>
 4         /// 校验当前模型
 5         /// </summary>
 6         /// <param name="model"></param>
 7         /// <param name="errorMsg"></param>
 8         /// <param name="ignores"></param>
 9         /// <returns></returns>
10         public static bool Check(object model, ref string errorMsg, IEnumerable<string> ignores = null)
11         {
12             ValidationContext context = new ValidationContext(model);
13             List<ValidationResult> results = new List<ValidationResult>();
14             bool isVail = Validator.TryValidateObject(model, context, results, true);
15             if (isVail)
16             {
17                 errorMsg = "验证通过";
18                 return true;
19             }
20             //判断是否有需要忽略的
21             if (ignores != null)
22               results=results.Where(o =>!ignores.Contains(o.MemberNames.FirstOrDefault())).ToList();
23             if (results.Count > 0)
24             {
25                 errorMsg = results.FirstOrDefault().ErrorMessage;
26                 return false;
27             }
28             errorMsg = "验证通过";
29             return true;
30 
31         }
32 
33 
34     }
View Code
 1 /// <summary>
 2     /// 正则表达式常量(随时可扩展)
 3     /// </summary>
 4     public class PattarmConst
 5     {
 6         /// <summary>
 7         /// 邮箱
 8         /// </summary>
 9         public const string IsMail = @"^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$";
10         /// <summary>
11         /// 手机号
12         /// </summary>
13         public const string IsPhone = @"^1[3|4|5|7|8|9][\d]{9}$";
14         /// <summary>
15         /// url
16         /// </summary>
17         public const string IsUrl = @"^((https|http|ftp|rtsp|mms){0,1}(:\/\/){0,1})www\.(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$";
18         /// <summary>
19         /// 汉字
20         /// </summary>
21         public const string IsChinese = @"[\u4e00-\u9fa5]";
22         /// <summary>
23         /// 15 or 18位的身份证号
24         /// </summary>
25         public const string IsIDCard = @"^\d{15}|\d{18}";
26         /// <summary>
27         /// 金额
28         /// </summary>
29         public const string IsPrice = @"^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$";
30     }
View Code
 1 /// <summary>
 2     /// 校验属性自定义扩展
 3     /// </summary>
 4     public class RequireExt : ValidationAttribute
 5     {
 6         public RequireType RequireType { get; set; }
 7         public override bool IsValid(object value)
 8         {
 9             if (value == null)
10             {
11                 return false;
12             }
13             string pattarn = string.Empty;
14             switch (RequireType)
15             {
16                 case RequireType.PHONE:
17                     pattarn = PattarmConst.IsPhone;
18                     break;
19                 case RequireType.MAIL:
20                     pattarn = PattarmConst.IsMail;
21                     break;
22                 case RequireType.URL:
23                     pattarn = PattarmConst.IsUrl;
24                     break;
25                 case RequireType.IDCARD:
26                     pattarn = PattarmConst.IsIDCard;
27                     break;
28                 case RequireType.PRICE:
29                     pattarn = PattarmConst.IsPrice;
30                     break;
31                 default:
32                     throw new AccessViolationException("未定义的枚举类型");
33             }
34             if (!Regex.IsMatch(value.ToString(), pattarn))
35             { return false; }
36             return true;
37         }
38     }
39     /// <summary>
40     /// 校验枚举类型
41     /// </summary>
42     public enum RequireType
43     {
44         [Description("手机号")]
45         PHONE = 1,
46         [Description("邮箱")]
47         MAIL = 2,
48         [Description("正规URL")]
49         URL=3,
50         [Description("身份证号")]
51         IDCARD=4,
52         [Description("金额")]
53         PRICE=5
54     }
View Code

 

posted @ 2018-12-05 22:55  深海里的一条鱼  阅读(317)  评论(0编辑  收藏  举报