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


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

    代码如下:

    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;
            }
        }
    }
    

      

    <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

  • 相关阅读:
    poj2886 Who Gets the Most Candies?
    poj1201 Intervals
    poj3109 Inner Vertices
    poj1990 MooFest
    poj3368 Frequent values
    NOIP练习赛题目6
    NOIP练习赛题目5
    NOIP练习赛题目4
    NOIP练习赛题目3
    NOIP练习赛题目2
  • 原文地址:https://www.cnblogs.com/majiang/p/5342823.html
Copyright © 2020-2023  润新知