自定义验证规则ValidationAttribute的使用

概述

大家在做项目的时候,在实体类上添加一些特性,可以实现后端实体的数据校验。有时候,可能需要自定义验证属性。实现原理:利用反射获取实体的每一个属性,并通过属性获取属性上标注的特性,调用特性的Validate方法(此方法自定义的)来验证属性的值是否合法。

代码实现

1、自定义CustomizedStringLength,继承StringLengthAttribute

 public class CustomizedStringLength : StringLengthAttribute{private Type resourceType;private string resourceName;public CustomizedStringLength(int MaximumLength, Type ResourceType, string ResourceName) : base(MaximumLength){resourceType = ResourceType;resourceName = ResourceName;}public CustomizedStringLength(int MaximumLength) : base(MaximumLength){}public override string FormatErrorMessage(string name){string fieldName = resourceType.GetProperty(resourceName).GetValue(resourceType).ToString();if (MinimumLength != 0){this.ErrorMessage = string.Format(PageValidation.LimitLength, fieldName, MaximumLength, MinimumLength);}else{this.ErrorMessage = string.Format(PageValidation.StringMaxLengthTemplate, fieldName, MaximumLength);}return base.FormatErrorMessage(name);}}
}

2、Application_Start全局注册

  //在 Controller 之前對 Model 做處理(字串 Trim)ModelBinders.Binders.DefaultBinder = new BQoolModelBinder();//註冊自訂的 Validation (複寫預設的錯誤訊息)CustomerValidation.RegisterCustomerValidation();DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(CustomizedRequired), typeof(RequiredAttributeAdapter));DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(CustomizedStringLength), typeof(StringLengthAttributeAdapter));

3、在字段调用CustomizedStringLength

    [CustomizedRequired(ResourceType: typeof(AccountSettingsElement), ResourceName: "AccountEmail")][CustomizedStringLength(100, ResourceType: typeof(AccountSettingsElement), ResourceName: "AccountEmail")][CustomizedRegularExpression(@"^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$", ResourceType: typeof(AccountSettingsElement), ResourceName: "AccountEmail")][Display(ResourceType = typeof(AccountSettingsElement), Name = "AccountEmail")]public string AccountEmail { get; set; }

4、控制器上验证ModelState.IsValid

  if (!ModelState.IsValid){Response.Redirect(Request.Url.AbsolutePath);Response.End();return;}

当我们通过继承ValidationAttribute创建我们自己的验证特性的时候,可以通过重写公有方法IsValid或者受保护方法IsValid来实现我们自定义的验证逻辑。我们之所以能够通过重写任一个IsValid方法是我们自定义验证逻辑生效的原因在于这两个方法在ValidationAttribute特殊的定义方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【百度分享】基于内核模块的测试代码编写(二)

4. 用户空间和内核空间的交互 在解决了在内核空间置入可运行代码后,需要解决的是用户空间和内核空间的交互。具体来说,需要达到以下三个功能:用户空间的程序向内核空间下的程序控制,用户空间到内核空间的数据传递,内…

linux sed 空间模式,整理:SED的模式空间与缓冲区及n,N,d,D,p,P,h,H,g,G,x解析...

sed命令n,N,d,D,p,P,h,H,g,G,x解析1、sed执行模板sed ‘模式{命令1;命令2}’ 即逐行读入模式空间,执行命令,最后输出打印出来2、p打印…

你碰到过的最难调试的 Bug 是什么样的?

我们做开发的应该都会有深刻的体会,有时候会遇到一些莫名奇妙的BUG不知所措,解决BUG到近乎崩溃,更有甚者有人居然会在梦中解决掉BUG。下面我们看几个有意思的解决Bug的故事:知乎网友李幼萌:08年的时候,我所…

java面试题1

一、基础问答 1.下面哪些类可以被继承? java.lang.Thread (T)    java.lang.Number (T)    java.lang.Double (F)    java.lang.Math (F)    java.lang.Void (F)    java.lang.Class (F)    java.lang.ClassLoader (T) 2.抽象类和接口的区别 (1)接口可以被多…

云原生 | 阿里巴巴的Dapr实践与探索

【Dapr】| 原文/敖小剑,翻译/Edison本文原文来自Dapr Blog,作者阿里云高级技术专家敖小剑。本文是我根据自己的理解翻译了其中的一部分并加了一些参考文献中的内容,所以并非完整翻译,点击本文底部“阅读原文”即可阅读原版英文全文…

linux安装grpc占用空间大,grpc linux安装-Go语言中文社区

1. go protobuf 安装Protoc Buffer 安装包下载地址:https://github.com/protocolbuffers/protobuf/releases/download/v3.9.0/protoc-3.9.0-linux-x86_64.zip(使用wget命令下载),最新版本可在此页面查看。下载完成后,解压。将解压出来的inclu…

《Objective-C基础教程》第二章 对C的扩展

.m代表message。编译工作由GCC(GNU Compiler Collection,GNU编译器集合)处理,可以理解C语言的全部3个变体。NS代码前缀表示来自Cocoa,苹果收购的NeXT Software公司开发的NextSTEP工具包。布尔类型BOOL具有YES和NO值,但使用8位存储…

阿里25k招.NET,要求WPF!

说到WPF、上位机,很多.NET开发者可能只是听过并不了解,然而随着工业4.0的火爆大势,当下.NET开发者又多了一个高薪选型,在各大招聘网站上都能找到5年经验25k左右的岗位,近日阿里对.NET的招聘,明确就要求的WP…

我们计划招收300名学员,免费攻读人工智能专业

给大家看一份最新的数据:(薪资表)2018年最新数据:python、大数据、人工智能从业者工资为什么人工智能行业的工资那么高?无论是科研院所,商业巨头还是初创企业,各行各业都在大力开发或者引进人工…

Linux查看设备 eth,lspci grep Eth,查看Linux下的各种硬件设备是否识别或存在之用

背景:Linux下的硬件有很多,如何看网卡是啥样的,声卡是啥样的有几个USB口及品牌。[rootemulMachine htdocs]# lspci |grep USB00:03.0 USB controller: Broadcom BCM5785 [HT1000] USB (rev 01)00:03.1 USB controller: Broadcom BCM5785 [HT1…

一日一技:ASP.NET Core 判断请求是否为Ajax请求

概述在写后台程序时,有时候需要知道客户端发送的是普通的请求,还是ajax 请求,最近在做项目的时候,有些地方需要判断当前的请求是不是ajax。特地找了下发现,jQuery 发出 ajax 请求时,会在请求头部添加一个名…

HttpHandler浅析

声明:本文为翻译文章,如有侵权,请告知,我将会在1个工作日内删除,谢谢. ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ 总是想着展翅飞翔,但是却不料一直受伤,但是那寻梦的心啊,永远向往着远方. ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★…

神经网络简史:BP算法后的又一突破—信念网络

随着训练多层神经网络的谜题被揭开,这个话题再一次变得空前热门,罗森布拉特的崇高雄心似乎也将得以实现。直到1989年另一个关键发现被公布,现在仍广为教科书及各大讲座引用。多层前馈神经网络是普适模拟器( universal approximato…

Linux网络模块全局变量,()不是Linux系统的特色.

相关题目与解析UNIX是一个交互式的______操作系统,采用以全局变量为中心的模块结构。下列关于UNIX系统结构的描述中,正确的是______。A.UNIX系统是一个交互式的多用户、多任务分时操作按照变量的作用域可将变量划分为()A.公有、私有、系统B.全…

NET问答:Select 和 SelectMany 的区别

咨询区 Tarik:我已经 google 搜索了 Select 和 SelectMany 之间的区别,但我并没有找到合适的答案,我现在急切的需要知道在 Linq to SQL 时两者的区别而不是给我用Array展示...能否有人帮忙提供 Linq To SQL 的例子吗?回答区 Mike …

最好的FLV视频下载器 维棠 (支持优酷视频下载、土豆视频下载等)

维棠FLV视频下载能帮助你轻松下载国内外大多数FLV视频分享网站的视频内容;并且维棠FLV视频下载具有断点续传功能。 现在国内外出现了很多视频分享网站,每个用户都可以把自己的视频节目和其他人分享。这些网站有大量的在线视频资源,但是由于网络带宽的限…

linux ns3配置环境,Ubuntu下的NS3安装与入门

NS3的开发旨在为网络研究和教育提供开放,可扩展的网络仿真平台。简而言之,NS3提供了分组数据网络如何工作和执行的模型,并为用户提供了进行模拟实验的模拟引擎。使用ns-3的一些原因包括进行更难或不可能用真实系统执行的研究,在高…

龙芯3A5000完成流片 同主频性能追平AMD Zen1

前不久,龙芯3A5000完成流片,该CPU基于龙芯自主定义指令集LoongArch。据小道消息,SPEC06测试定点26分(base 2.5Ghz)。这个成绩已经达到预期指标,而且经过进一步优化,SPEC06成绩还有进一步优化的…

Funambol DM 安装过程

Funambol DM 安装过程 Funambol安装过程包括了 Java环境安装 ,Mysql安装 ,Jboss安装和 Funambol DM的安装 .一 : Java环境安装 1: Java现在使用的版本是 :jdk-1_5_0-windows-i586.exe . 2: 安装完毕 ,请在 windows系统下设置环境变量 JAVA_HOME{jdk的安装目录 } 如 : J…

熬夜族又一噩耗:“早死”风险更高!

根据美国西北大学范伯格医学院和英国萨里大学最近的一项研究,相比于早睡早起的人(百灵鸟一般),晚上不睡、早晨不起,或起床困难的“夜猫子”们,“早死”的风险更高。这项基于英国生物库中将近50万人样本的研…