ASP.NET MVC 3 Validation - 正则表达式验证RegularExpressionAttribute之日期验证
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之日期验证相关推荐
- mvc html validator,ASP.NET MVC实现Validation验证器扩展
今天介绍在ASP.NET MVC实现Validation验证器扩展,通过使用Controller验证并不是最好的方法:验证过于分散,容易造成重复代码,不利于维护与扩展,因此本节将使用MVC默认绑定器( ...
- DynamicData for Asp.net Mvc留言本实例 中篇 新建.删除.数据验证
上篇咱完成了显示列表的功能,下面接着来 也许您有疑问,这个显示列表不是和正常的Asp.net Mvc差不多吗?也是个foreach只是由原来的<%=字段%>变成了<% Html.Re ...
- [翻译-ASP.NET MVC]Contact Manager开发之旅迭代3 - 验证表单
本翻译系列为asp.net mvc官方实例教程.在这个系列中,Stephen Walther将演示如何通过ASP.NET MVC framework结合单元测试.TDD.Ajax.软件设计原则及设计模 ...
- ASP.NET MVC 音乐商店 - 6. 使用 DataAnnotations 进行模型验证
在前面的创建专辑与编辑专辑的表单中存在一个问题:我们没有进行任何验证.字段的内容可以不输入,或者在价格的字段中输入一些字符,在执行程序的时候,这些错误会导致数据库保存过程中出现错误,我们将会看到来自数 ...
- ASP.NET MVC 4 (十三) 基于表单的身份验证
在前面的章节中我们知道可以在MVC应用程序中使用[Authorize]特性来限制用户对某些网址(控制器/控制器方法)的访问,但这都是在对用户认证之后,而用户的认证则依然是使用ASP.NET平台的认证机 ...
- 在ASP.NET MVC中使用Knockout实践07,自定义验证信息的位置与内容
在前两篇中,体验了Knockout的基本验证和自定义验证.本篇自定义验证信息的显示位置与内容. 自定义验证信息的显示位置 通常,Knockout的验证信息紧跟在input后面,通过validation ...
- ASP.NET MVC 框架
ASP.NET MVC 框架 [原文地址]ASP.NET MVC Framework [原文发表日期] Sunday, October 14, 2007 10:41 PM 过去的几年里,很多人要求AS ...
- 我要学ASP.NET MVC 3.0(一): MVC 3.0 的新特性
摘要 MVC经过其1.0和2.0版本的发展,现在已经到了3.0的领军时代,随着技术的不断改进,MVC也越来越成熟.使开发也变得简洁人性化艺术化. 园子里有很多大鸟都对MVC了如指掌,面对问题犹同孙悟空 ...
- 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学习系列文章- ...
最新文章
- Linux上制作可执行的共享库示例
- 关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了
- 递归第一弹:初步理解
- 排序算法汇总(转载收藏)
- Spring 钩子之BeanFactoryPostProcessor和BeanPostProcessor
- python opencv轮廓检测_OpenCV 轮廓检测的实现方法
- 9:38 2009-7-29
- Java自动化测试框架-06 - 来给你的测试报告化个妆整个形 - (下)(详细教程)
- 180多个web和desktop测试用例清单
- 安装及创建python虚拟环境
- 使用Node.js 搭建静态服务器
- 文献挖掘:SATI文献题录信息统计分析工具初试
- lightblue蓝牙调试助手v1.9.3 安卓最新版
- 本地项目上传至git码云步骤(超详细,附图文)
- java ftp上传文件 linux_linux下用java实现ftp上传、下载文件
- 《东周列国志》第四十三回 智宁俞假鸩复卫 老烛武缒城说秦
- 硬盘磁头坏数据有办法恢复吗?硬盘开盘数据恢复
- 超过70%的5G应用将发生于室内!共建共享室分助力5G高质量加速发展
- 程序员撩妹专用~~~好看的H5立方体创意相册,资源免费!!!程序员送给女孩子的礼物,非常适合送给小姐姐!
- MySQL 错误【四】Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp
热门文章
- ios 画带有箭头的线_ios纯色箭头与渐变色箭头的实现
- 1个报表工具,5大体系,60种可视化图表,靠这些打动领导就够了
- 连锁百货企业数据系统整理解决方案
- 帆软报表重要Activator之DesignerStartup中的GlobalListenerProvider扩展开发
- 计算机科学与python编程导论_【基于Python】MIT OCW 计算机科学与编程导论
- c++如何输入数组_工作表数组计算之一:行列数相同的数组间运算
- android jar包冲突_用好这几个技巧,解决Maven Jar包冲突易如反掌
- Java实验8 T6.绘制一个二叉树
- 深度学习————如何在Python中求解函数的解析表达式
- Python中if判断语句在只有一个break子句时可以写在一行