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

MultipleRegularExpressionAttribute MVC中扩展自定义验证规则的更多相关文章

  1. asp.net mvc 中的自定义验证(Custom Validation Attribute)

    前言

  2. YII开发技巧分享——模型(models)中rules自定义验证规则

    YII的models中的rules部分是一些表单的验证规则,对于表单验证十分有用,在相应的视图(views)里面添加了表单,在表单被提交之前程序都会自动先来这里面的规则里验证,只有通过对其有效的限制规 ...

  3. ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)

    ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需 要将相应的ValidationAttr ...

  4. 本版本延续MVC中的统一验证机制~续的这篇文章,本篇主要是对验证基类的扩展和改善(转)

    本版本延续MVC中的统一验证机制~续的这篇文章,本篇主要是对验证基类的扩展和改善 namespace Web.Mvc.Extensions { #region 验证基类 /// <summary ...

  5. yii2中自定义验证规则rules

    作者:白狼 出处:www.manks.top/article/yii2_custom_rules 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追 ...

  6. yii2中的rules 自定义验证规则详解

    yii2的一个强大之处之一就是他的Form组件,既方便又安全.有些小伙伴感觉用yii一段时间了,好嘛,除了比tp"难懂"好像啥都没有. 领导安排搞一个注册的功能,这家伙刷刷刷的又是 ...

  7. Django【第16篇】:Django之Form组件自定义验证规则

    自定义验证规则以及中间件简单介绍 1.python2和python3中的区别 对于python2内置的字符串类型有str和unicode 比如:"abc"是字符串,u"你 ...

  8. easyui的validatebox重写自定义验证规则的几个实例

    validatebox已经实现的几个规则: 验证规则是根据使用需求和验证类型属性来定义的,这些规则已经实现(easyui API): email:匹配E-Mail的正则表达式规则. url:匹配URL ...

  9. MVC ValidationAttribute 服务器端自定义验证

    MVC ValidationAttribute 服务器端自定义验证 客户端验证 上文只说了客户端的自定义验证,这样对于用户的输入还是不够可靠,用户完全可以绕过我们定义的客户端验证.所以仅有客户端的验证 ...

随机推荐

  1. Java 内存模型 ,一篇就够了!

    Java 虚拟机   我们都知道 Java 语言的可以跨平台的,这其中的核心是因为存在 Java 虚拟机这个玩意.虚拟机,顾名思义就是虚拟的机器,这不是真实存在的硬件,但是却可以和不同的底层平台进行交 ...

  2. Python 项目实践三(Web应用程序) 第三篇

    接着上节的继续学习,现在要显示所有主题的页面 有了高效的网页创建方法,就能专注于另外两个网页了:显示全部主题的网页以及显示特定主题中条目的网页.所有主题页面显示用户创建的所有主题,它是第一个需要使用数 ...

  3. python中关于if-else使用性能的一点感悟

    今天做leetcode第7题关于数字倒序的问题,分别使用如下程序:(72ms) class Solution: def reverse(self, x): """ :ty ...

  4. LOJ.2863.[IOI2018]组合动作(交互)

    题目链接 通过两次可以先确定首字母.然后还剩下\(n-1\)位,之后每一位只有三种可能. 最简单的方法是每次确定一位,通过两次询问显然可以确定.但是只能一次询问. 首字母只会出现一次,即我们可以将串分 ...

  5. Java并发(十八):阻塞队列BlockingQueue

    阻塞队列(BlockingQueue)是一个支持两个附加操作的队列. 这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用. 阻塞队列常用于生产 ...

  6. 【BZOJ-4184 】 Shallot 线段树按时间分治 + 线性基

    4184: shallot Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 356  Solved: 180[Submit][Status][Discu ...

  7. 用 CSS 实现三角形与平行四边形

    最近在逛某个技术网站的时候,感觉文章关键词上的样式好酷炫啊.于是我将那种写法照搬到了我的博客中,也许最近逛过我博客的小伙伴已经发现了它出现在哪儿了——分页的样式.来张截图: 你在首页的底部也可以看到这 ...

  8. 使用EF Code First搭建一个简易ASP.NET MVC网站,允许数据库迁移

    本篇使用EF Code First搭建一个简易ASP.NET MVC 4网站,并允许数据库迁移. 创建一个ASP.NET MVC 4 网站. 在Models文件夹内创建Person类. public ...

  9. UIImageView 详解

    1.//设置 圆角 userhead.layer.masksToBounds = YES; userhead.layer.cornerRadius = 6.0; userhead.layer.bord ...

  10. HelloWorld 之JasperReports初步

    在企业应用系统中,经常要输出各种格式的数据报表. 著名的开源项目<JasperReports可以很好的解决这个问题. 使用JasperReports可以在预先设定好格式的报表基础上进行数据的填充 ...