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

来源:互联网 发布:淘宝拉夏贝尔代购 编辑:程序博客网 时间:2024/06/06 03:36

MultipleRegularExpressionAttribute

好久都没有写博客,最近工作中没有什么可写的,公司的项目是以业务为重,技术含量实在不咋的。这次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

这里有几个注意的地方:

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

0 0
原创粉丝点击