MultipleRegularExpressionAttribute MVC中扩展自定义验证规则

好久都没有写博客,最近工作中没有什么可写的,公司的项目是以业务为重,技术含量实在不咋的。这次sprint中有一个要求就是password必须一些规则,比如给你一些正则表达式必须满足几个,直接看效果吧

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
namespace System.ComponentModel.DataAnnotations
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Runtime.CompilerServices;
    using Text.RegularExpressions;   
    using Globalization;
    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    public class MultipleRegularExpressionAttribute : ValidationAttribute, IClientValidatable
    {
        public MultipleRegularExpressionAttribute(string[] patterns,int minMatchNo)
        {
            if (patterns == null || patterns.Length < 1)
            {
                throw new ArgumentNullException("patterns");
            }
            if (minMatchNo <= 0)
            {
                throw new ArgumentException("minValidCount must bigger than 0");
            }
            MinMatchNo = minMatchNo;
            Regexs = new Regex[patterns.Length];
            for (int i = 0; i < patterns.Length; i++)
            {
                Regexs[i] = new Regex(patterns[i]);
            }
        }
 
        public override string FormatErrorMessage(string name)
        {
            if (!string.IsNullOrEmpty(ErrorMessage))
            {
                return ErrorMessage;
            }
            string message = "the input value must match " + MinMatchNo.ToString() + " below Regex:";
            foreach (var item in Regexs)
            {
                message += " \""+item.ToString() + "\" ;";
            }
            return message;
        }
 
        public override bool IsValid(object value)
        {
            string str = Convert.ToString(value, CultureInfo.CurrentCulture);
            if (string.IsNullOrEmpty(str))
            {
                return true;
            }
            int validedCount = 0;
            foreach (var reg in Regexs)
            {
                Match match = reg.Match(str);
                if ((match.Success && (match.Index == 0)) && (match.Length == str.Length))
                    validedCount += 1;
            }
            
            return validedCount>= MinMatchNo;
        }
 
        private Regex[] Regexs { set; get; }
        private int MinMatchNo { set; get; }
        public IEnumerable<ModelClientValidationRule>   GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            var validationRule = new ModelClientValidationRule
            {
                ErrorMessage = FormatErrorMessage(metadata.DisplayName),
                ValidationType = "mulregular",
            };
            validationRule.ValidationParameters.Add("minmatchno", MinMatchNo);
            validationRule.ValidationParameters.Add("regexs", string.Join(",",Regexs.Select(x=>x.ToString()).ToArray()));
 
            yield return validationRule;
        }
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<script type="text/javascript" src="~/Scripts/jquery-1.10.2.js"></script>
<script type="text/javascript" src="~/Scripts/jquery.validate.js"></script>
<script type="text/javascript" src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script type="text/javascript">
    $(function () {
        //第一个参数是jquery验证扩展方法名
        //第二个参数与rule.ValidationParameters["XXX"]中的key对应
        //option是指ModelClientValidationRule对象实例
        jQuery.validator.unobtrusive.adapters.add('mulregular', ['regexs', 'minmatchno'], function (options) {
            options.rules["mulregular"] = {
                regexs: options.params.regexs,
                minmatchno: options.params.minmatchno
            };
            if (options.message) {
                options.messages['mulregular'] = options.message;
            }
        });
 
        //意思是表单值为空时也能通过验证
        //但,如果表单有值,就必须满足||后面的条件,否则返回false
    jQuery.validator.addMethod('mulregular', function (value, element, param) {
        if (this.optional(element)) {
            return true;
        }
        var regs = param["regexs"].split(",");
        var minmatchno = param["minmatchno"] - 0;
        for (var i = 0; i < regs.length; i++) {
            var match = new RegExp(regs[i]).exec(value);
            if (match && (match.index === 0) && (match[0].length === value.length)) {
                minmatchno -= 1;
            }
        }
        return minmatchno <= 0;
    });
 
 
    });
</script>

  

[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
[MultipleRegularExpression( new string[] {".*[a-z]+.*",".*[A-Z]+.*",".*\\d+.*",".*(\\W+|_+).*" },3)]
public string Password { get; set; }

 

这里有几个注意的地方:

1.GetClientValidationRules 方法里面ValidationType和ValidationParameters的key只能是全部小写

2.只有在 jQuery.validator.unobtrusive.adapters 方法中定义了的参数 ['regexs', 'minmatchno'] 才能在 jQuery.validator.addMethod 对应的方法mulregular 中使用。

网上的案例已经有很多了,大家也可以参考:

http://www.cnblogs.com/yehuabin/archive/2012/09/23/unobtrusive-validation.html

http://www.cnblogs.com/xcsn/p/4666718.html

http://www.cnblogs.com/xfrog/archive/2011/01/25/1944867.html

posted on   dz45693  阅读(1603)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示