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