ASP.NET MVC 3中,正则表达式的验证属性是RegularExpressionAttribute。

问题:

日期格式进行Server端和Client端的验证

解决方案(1):

直接使用RegularExpressionAttribute,写正则表达式。

[RegularExpression(@"Regular Expression Here", ErrorMessage = "Please input valid date format")]
public String RegualarExpressionField { get; set; }  

这样做的好处是比较直接,但当正则表达式比较复杂时,代码会显得并不怎么优雅。

解决方案(2)

从RegularExpressionAttribute直接派生出DateExpressionAttribute

public class DateExpressionAttribute : RegularExpressionAttribute
{  public DateExpressionAttribute()  : base("Date Regular Expression Here")  {  }
} 

较之方案(1)的做法,好处是能够把正则表达式封装起来,复用性更强(方案(1)中,每个日期验证都需要将正则表达式拷贝一遍,如此代码的维护工作量可想而知)。

建立一个测试model:

public class TestModel
{  [DateExpression]  public DateTime? DateField { get; set; }  [RegularExpression(@"Regular Expression Here", ErrorMessage = "Please input valid date format")]  public String RegualarExpressionField { get; set; }  

page:

    <div><fieldset><legend>Account Information</legend><div class="editor-label">@Html.LabelFor(m => m.DateField)</div><div class="editor-field">@Html.TextBoxFor(m => m.DateField)@Html.ValidationMessageFor(m => m.DateField)</div><div class="editor-label">@Html.LabelFor(m => m.RegualarExpressionField)</div><div class="editor-field">@Html.TextBoxFor(m => m.RegualarExpressionField)@Html.ValidationMessageFor(m => m.RegualarExpressionField)</div><p><input type="submit" value="go!" /></p></fieldset></div>

运行之后会发现两个问题:①方案(2)中,客户端的验证没有被触发②即使输入完全符合正则表达式的值,两个方案经Server端验证后,全部返回验证的错误信息讨论:问题①的原因:我们在DateExpressionAttribute并没有实现IClientValidatable接口,故Client端的验证不会被触发;修改类如下:

    public class DateExpressionAttribute : RegularExpressionAttribute, IClientValidatable{public DateExpressionAttribute(): base(@"Your date regular expression here"){}public override string FormatErrorMessage(string name){return String.Format(CultureInfo.CurrentCulture,"The filed {0} should be a date", name);}public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context){var name = metadata.GetDisplayName();var rule = new ModelClientValidationRegexRule(FormatErrorMessage(name), Pattern);yield return rule;}}

再次运行,方案(2)的客户端验证也可以成功触发了。

问题②的原因:
由于我们定义的两个字段都是DateTime类型,故从前台传到后台后,实际去进行验证的时间格式是DateTime(yyyy-MM-dd hh:mm:ss),所以正则表达式必然返回错误(几乎永远不可能通过)。另外,将Client端的验证关掉,输入abc后,返回的错误是"The value "abc" is not a valid value for DateField"。这个错误并不是正则表达式的验证错误,而是当试着把"abc"转换成DateTime类型的时候所抛出的错误,也就是说,你如果输入了无法转换成DateTime类型的值的话,验证是不会经过正则表达式那一端的。当你到达正则表达式验证的时候,输入的日期格式已经被转换成了DateTime了。

此时,可以考虑把DateExpression的Server端验证拿掉,最终代码如下:

    public class DateExpressionAttribute : RegularExpressionAttribute, IClientValidatable{public DateExpressionAttribute(): base(@"((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([3579][26]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))"){}public override bool IsValid(object value){return true;}public override string FormatErrorMessage(string name){return String.Format(CultureInfo.CurrentCulture,"The filed {0} should be a date", name);}public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context){var name = metadata.GetDisplayName();var rule = new ModelClientValidationRegexRule(FormatErrorMessage(name), Pattern);yield return rule;}}

若是仍需要加Server端的验证的话,另一个间接方法就是暂时用String来取得Date的值。这样一来不必经过DateTime类型的转化。即便输入了错误的格式,也能够进行Server端的验证,返回期望的错误消息。在Server端验证通过后,再手动将字符串转化为日期格式。

转载于:https://www.cnblogs.com/8090sns/archive/2012/08/09/RegularExpressionAttribute%e4%b9%8b%e6%97%a5%e6%9c%9f%e9%aa%8c%e8%af%81.html

ASP.NET MVC 3 Validation - 正则表达式验证RegularExpressionAttribute之日期验证相关推荐

  1. mvc html validator,ASP.NET MVC实现Validation验证器扩展

    今天介绍在ASP.NET MVC实现Validation验证器扩展,通过使用Controller验证并不是最好的方法:验证过于分散,容易造成重复代码,不利于维护与扩展,因此本节将使用MVC默认绑定器( ...

  2. DynamicData for Asp.net Mvc留言本实例 中篇 新建.删除.数据验证

    上篇咱完成了显示列表的功能,下面接着来 也许您有疑问,这个显示列表不是和正常的Asp.net Mvc差不多吗?也是个foreach只是由原来的<%=字段%>变成了<% Html.Re ...

  3. [翻译-ASP.NET MVC]Contact Manager开发之旅迭代3 - 验证表单

    本翻译系列为asp.net mvc官方实例教程.在这个系列中,Stephen Walther将演示如何通过ASP.NET MVC framework结合单元测试.TDD.Ajax.软件设计原则及设计模 ...

  4. ASP.NET MVC 音乐商店 - 6. 使用 DataAnnotations 进行模型验证

    在前面的创建专辑与编辑专辑的表单中存在一个问题:我们没有进行任何验证.字段的内容可以不输入,或者在价格的字段中输入一些字符,在执行程序的时候,这些错误会导致数据库保存过程中出现错误,我们将会看到来自数 ...

  5. ASP.NET MVC 4 (十三) 基于表单的身份验证

    在前面的章节中我们知道可以在MVC应用程序中使用[Authorize]特性来限制用户对某些网址(控制器/控制器方法)的访问,但这都是在对用户认证之后,而用户的认证则依然是使用ASP.NET平台的认证机 ...

  6. 在ASP.NET MVC中使用Knockout实践07,自定义验证信息的位置与内容

    在前两篇中,体验了Knockout的基本验证和自定义验证.本篇自定义验证信息的显示位置与内容. 自定义验证信息的显示位置 通常,Knockout的验证信息紧跟在input后面,通过validation ...

  7. ASP.NET MVC 框架

    ASP.NET MVC 框架 [原文地址]ASP.NET MVC Framework [原文发表日期] Sunday, October 14, 2007 10:41 PM 过去的几年里,很多人要求AS ...

  8. 我要学ASP.NET MVC 3.0(一): MVC 3.0 的新特性

    摘要 MVC经过其1.0和2.0版本的发展,现在已经到了3.0的领军时代,随着技术的不断改进,MVC也越来越成熟.使开发也变得简洁人性化艺术化. 园子里有很多大鸟都对MVC了如指掌,面对问题犹同孙悟空 ...

  9. ASP.NET MVC 3.0学习系列文章—Model in ASP.NET MVC 3.0

    系列文章 ASP.NET MVC 3.0学习系列文章-序 ASP.NET MVC 3.0学习系列文章--Razor and ASP.NET MVC 3.0 ASP.NET MVC 3.0学习系列文章- ...

最新文章

  1. Linux上制作可执行的共享库示例
  2. 关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了
  3. 递归第一弹:初步理解
  4. 排序算法汇总(转载收藏)
  5. Spring 钩子之BeanFactoryPostProcessor和BeanPostProcessor
  6. python opencv轮廓检测_OpenCV 轮廓检测的实现方法
  7. 9:38 2009-7-29
  8. Java自动化测试框架-06 - 来给你的测试报告化个妆整个形 - (下)(详细教程)
  9. 180多个web和desktop测试用例清单
  10. 安装及创建python虚拟环境
  11. 使用Node.js 搭建静态服务器
  12. 文献挖掘:SATI文献题录信息统计分析工具初试
  13. lightblue蓝牙调试助手v1.9.3 安卓最新版
  14. 本地项目上传至git码云步骤(超详细,附图文)
  15. java ftp上传文件 linux_linux下用java实现ftp上传、下载文件
  16. 《东周列国志》第四十三回 智宁俞假鸩复卫 老烛武缒城说秦
  17. 硬盘磁头坏数据有办法恢复吗?硬盘开盘数据恢复
  18. 超过70%的5G应用将发生于室内!共建共享室分助力5G高质量加速发展
  19. 程序员撩妹专用~~~好看的H5立方体创意相册,资源免费!!!程序员送给女孩子的礼物,非常适合送给小姐姐!
  20. MySQL 错误【四】Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp

热门文章

  1. ios 画带有箭头的线_ios纯色箭头与渐变色箭头的实现
  2. 1个报表工具,5大体系,60种可视化图表,靠这些打动领导就够了
  3. 连锁百货企业数据系统整理解决方案
  4. 帆软报表重要Activator之DesignerStartup中的GlobalListenerProvider扩展开发
  5. 计算机科学与python编程导论_【基于Python】MIT OCW 计算机科学与编程导论
  6. c++如何输入数组_工作表数组计算之一:行列数相同的数组间运算
  7. android jar包冲突_用好这几个技巧,解决Maven Jar包冲突易如反掌
  8. Java实验8 T6.绘制一个二叉树
  9. 深度学习————如何在Python中求解函数的解析表达式
  10. Python中if判断语句在只有一个break子句时可以写在一行