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

常用正则表达式如:日期正则表达式,使用RegularExpressionValidator验证控件时的验证功能及其验证表达式,从URL地址中提取文件名的javascript程序等 包含在我们平时编程中常用正则表达式如:日期正则表达式,使用RegularExpressionValidator验证控件时的验证功能及其验证表达式,从URL地址中提取文件名的javascript程序等 立即下载

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端验证通过后,再手动将字符串转化为日期格式。


英飞凌AURIX™ TC3xx系列MCU的ISO 26262安全机制实战:从安全手册到代码集成的避坑指南 本文深入探讨英飞凌AURIX™ TC3xx系列MCU的ISO 26262安全机制实战应用,重点解析锁步核配置、ECC策略优化及SafeTlib库集成中的关键问题。通过代码示例和配置建议,帮助开发者实现ASIL D级别安全性,规避常见陷阱,提升汽车电子系统的功能安全合规性。 阅读详情

相关推荐

避坑指南:RFSoC数据转换器多片同步配置的7个致命错误

本文深入剖析了在配置RFSoC多片同步功能时,工程师最常遇到的七个致命错误。从Tile 0的强制启用、时钟域与SYSREF时序,到跨代器件兼容性、电源序列以及动态重配置的陷阱,文章结合实战经验,提供了从原理到调试的完整RF数据转换器配置指南,旨在帮助开发者高效构建相位一致的大规模射频采样系统。

weixin_28452161的博客 533

asp.net中如何验证日期格式是否正确

1. js方法: 需要调用日期验证的正则表达式: 日期的正则表达式,YYYY-MM-DD YYYY/MM/DD YYYY.MM.DD "^(?:(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?

wuxiupeng的专栏 8917

HFSS新手避坑指南:从零搭建T形波导功分器(含参数扫描与优化实战)

本文为HFSS新手提供T形波导功分器设计的详细指南,涵盖基础设置、建模技巧、参数扫描与优化实战。重点解析内场分析中的常见陷阱,如单位设置、波端口定义和布尔运算错误,并分享优化设计的关键步骤,帮助工程师快速掌握HFSS在微波器件设计中的应用。

weixin_27442001的博客 138

C#正则表达式RegularExpression相关知识(Regex类使用详情)

C#正则表达式相关知识 我就是我网络团队编辑 队长:我就是我 联系方式:QQ1305524514 本文档为本人学习总结,义务提供,不作为商用,侵权请联系删除 本文档部分内容为转载,转载处在下会标明 1. 原样匹配 任意字符:原样匹配任意字符 例如:123,会匹配一串字符中是否有123字符,通常用作格式识别! 2.转义字符(转载) \b 匹配一个单词边界,也就是指单词和空格间的位置。例如,“...

我就说我500的博客 2243

保姆级教程:手把手教你为裕泰微YT8521 PHY芯片编写Linux设备树(DTS)节点与驱动

本文提供了一份详细的保姆级教程,手把手教你为裕泰微YT8521 PHY芯片编写Linux设备树(DTS)节点与驱动。从基础配置到RGMII接口的特殊设置,再到驱动开发的关键步骤和调试技巧,帮助开发者快速掌握PHY芯片的移植与开发。

weixin_33734785的博客 333

Switch游戏安装新思路:抛弃Commander One,试试这款免费的Mac神器OpenMTP

本文介绍了Mac用户安装Switch游戏的新选择——免费工具OpenMTP,对比收费软件Commander One,OpenMTP在MTP连接稳定性和文件管理上更具优势。详细解析了OpenMTP的安装配置、核心功能及实战操作,帮助用户高效完成游戏安装,特别适合已破解并安装DBI的Switch用户。

weixin_30664051的博客 578

正则表达式(Regular Expression)基本语法

一、简介 为什么需要正则表达式? 文本的复杂处理正则表达式的优势和用途? 一种强大而灵活的文本处理工具; 大部分编程语言、数据库、文本编辑器、开发环境都支持正则表达式。正则表达式定义: 正如它的名字一样,是描述了一个规则,通过这个规则可以匹配一类字符串。 学习正则表达式很大程度上就是学习正则表达式的语法现则。开发中如何使用? 开发中使用正则表达式的流程: 分析所要匹配的数据,写出测试

吃果冻不吐果冻皮 2万+

【2026年阿里巴巴集团暑期实习- 4月25日-算法岗-第二题- 矩阵计数】(题目+思路+Java&C++&Python解析+在线测试)

摘要: 给定两个非负整数序列a和b,构造n×m矩阵C,其中C[i][j]=a[i]×b[j]。统计矩阵中元素≥k的数量。解法是先对数组b排序,然后对于每个a[i],若k=0则直接累加m;若a[i]=0且k>0则跳过;否则计算需要的最小b[j]值,在排序后的b中使用二分查找确定满足条件的元素数量。时间复杂度为O((n+m)log m),空间复杂度O(1)。代码实现了排序和二分查找的高效组合。

m0_73659489的博客 65

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

好久都没有写博客,最近工作中没有什么可写的,公司的项目是以业务为重,技术含量实在不咋的。这次sprint中有一个要求就是password必须一些规则,比如给你一些正则表达式必须满足几个,直接看效果吧 代码如下: namespace System.ComponentModel.DataAnnotations { using System; using Syste...

weixin_34235371的博客 164

rk628d修改默认分辨率

在rk3568上使用628d hdmi转mipi,在628d已经调试好的情况下,客户新增需求:视频输入这边的推荐分辨率固定在1024x768。

m0_60805802的博客 2053

【华为OD机试真题】4、字符统计及重排 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数, 并按照字母出现次数从大到小的顺序。输出各个字母及其出现次数。 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前

KJ.JK 3289

oc的正则表达式(RegularExpression)

OC的3种正则表达式 //查找数组中包含单词最多的元素,单词以空格分隔. NSArray *words = @[@"a b cc", @" a b ccdd d ", @"test"]; __block int maxNum = 0; __block int index = 0; [words enumerat

一分钟都市的乐园 5232

Linux ARM平台开发系列讲解(网络篇)1.3 MDIO总线设备device和设备driver匹配

在设备和驱动都载入内核后,设备和驱动是如何匹配起来的呢?其实他们就是通过的唯一标识phyID进行匹配phy_dev和phy_drv是通过phy_bus_match函数进行匹配,匹配成功后会建立链表链接,具体流程如下图: 返回总目录......

DSMGUOGUO的博客 1098

正则表达式Regular Expression

什么是 RegExp? RegExp 是正则表达式的缩写。 正则表达式( regular expression)描述了一种字符串匹配的模式。可以用来: (1)检查一个串中是否含有符合某个规则的子串,并且可以得到这个子串; (2)根据匹配规则对字符串进行灵活的替换操作 正则表达式在线测试网站,https://regexper.com/ 通过该网站,可以通过图形化的界面去领会...

dmersyvbqdmafi4866的博客 398

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Part 83 - RegularExpression attribute in asp.net mvc

Regular expression attribute is great for pattern matching validation. Let's understand using Regular expression attribute with an example. We will be continuing with the example that we started in 

zhouranlovesmile的博客 461

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Apache NIFI AttributesToJSON

描述: 该处理器将输入流文件属性转成JSON表示形式。生成的JSON可以被写入一个名为“JSONAttributes”的新属性,也可以作为内容写入到流文件中。 属性配置: 在下面的列表中,必需属性的名称以粗体显示。任何其他属性(不是粗体)都被认为是可选的,并且指出属性默认值(如果有默认值),以及属性是否支持表达式语言。 属性名称 默认值...

酷酷的诚的博客 2691

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ASP.NET 开发课程 MVC5 入门篇

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。主讲内容第一讲 MVC5简介第二讲 MVC 控制器第三讲 视图第四讲 模型等课程

正则表达式regular expression详述

正则表达式是regular expression,看来英文比中文要好理解多了,就是检查表达式符 不符合规定!!正则表达式有一个功能十分强大而又十分复杂的对象RegExp,在Javascript1.2 版本以 上提供。 下面我们看看有关正则表达式的介绍: 正则表达式对象用来规范一个规范的表达式(也就是表达式符不符合特定的要求,比如是不是Email 地址格式等),它具有用来检查给出的字符串是否符合规则

1万+

(八).net之特性Attribute声明、使用、验证

特性Attribute 特性:是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。 特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。

lwy 1735

validater验证输入日期的正则表达式

startDate : { validators : { regexp: { regexp: /^(??????!0000)[0-9]{4}-(??????:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-

波波豆奶 699

ASP.NET验证控件之RegularExpressionValidator

RegularExpressionValidator 控件用于验证输入值是否匹配正则表达式指定的模式。例如,邮箱、电话号码、邮编、整数、小数等等。利用正则表达式可以组合出各种的模式。几乎你想的到的都能写出来。下面我们一起来看这个神奇的控件。 RegularExpressionValidator 的属性: 属性 描述 BackColor

纸上得来终觉浅,绝知此事要躬行 1万+

RegularExpression

正则表达式经常被用于字段或任意字符串的校验,如下面这段校验基本日期格式的JavaScript代码: var reg = /^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/; var r = fieldValue.match(reg); if(r==null)alert('Date format error!'); 下面是技匠整理

菜菜鱼的博客 2000
上一篇: Javascript中文乱码问题
下一篇: 使用MbUnit进行数据驱动测试(单元测试)
jackvs
博客等级 码龄18年 7粉丝 30原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值