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

ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需要将相应的ValidationAttribute应用到Model的类型或者属性上即可。对于自定义验证,我们也只需要定义相应的Validation就可以了,不过服务端验证比较简单,而客户端验证就要稍微复杂一些,本文提供一个简单的实例说明在ASP.NET MVC中实现自定义验证的基本步骤。[源代码从这里下载]

一、AgeRangeAttribute

用于验证出生日期字段以确保年龄在制定的范围之内的AgeRangeAttribute定义如下,简单起见,我们直接让它直接继承自RangeAttribute。服务端验证逻辑定义在重写的IsValid方法中,并且重写了FormatErrorMessage方法以便生成针对年龄的验证消息。AgeRangeAttribute实现了IClientValidatable接口,并在实现的GetClientValidationRules方法中生成客户端验证规则。在生成的类型为“agerange”的ModelClientValidationRule 对象中包含三个参数(currentdate、minage和maxage),分别表示当前日期(用于计算年龄)、允许年龄的范围。

   1: public class AgeRangeAttribute : RangeAttribute, IClientValidatable   2: {   3:     public AgeRangeAttribute(int minimum, int maximum)   4:         : base(minimum, maximum)   5:     { }   6:   7:     public override bool IsValid(object value)   8:     {   9:         DateTime birthDate = (DateTime)value;  10:         DateTime age = new DateTime(DateTime.Now.Ticks - birthDate.Ticks);  11:         return age.Year >= (int)this.Minimum && age.Year <= (int)this.Maximum;  12:     }  13:  14:     public override string FormatErrorMessage(string name)  15:     {  16:         return base.FormatErrorMessage("年龄");  17:     }  18:  19:     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)  20:     {  21:         ModelClientValidationRule validationRule = new ModelClientValidationRule(){ ValidationType = "agerange", ErrorMessage= FormatErrorMessage(metadata.DisplayName)};  22:         validationRule.ValidationParameters.Add("currentdate",DateTime.Today.ToString("dd-MM-yyyy"));  23:         validationRule.ValidationParameters.Add("minage",this.Minimum);  24:         validationRule.ValidationParameters.Add("maxage",this.Maximum);  25:         yield return validationRule;  26:     }  27: }

二、注册客户端验证方法

由于ASP.NET MVC采用JQuery Validation进行客户端验证,我们可以通过如下的这段javascript来注册用于实现客户端验证的function和添加相应的adapter。添加到jQuery.validator的用于进行年龄范围验证的function具有三个参数(value、element、params)分别表示被验证的值、元素和传入的参数。验证逻辑必须的三个数值(当前日期、年龄范围最小和最大值)通过参数params获得。而该参数实际上是在添加adapter时从通过上面定义的GetClientValidationRules方法生成的验证规则中获取的。

   1: jQuery.validator.addMethod("agerange",   2: function (value, element, params) {   3:   4:     var minAge = params.minage;   5:     var maxAge = params.maxage;   6:   7:     var literalCurrentDate = params.currentdate;   8:     var literalBirthDate = value;   9:     var literalCurrentDates = literalCurrentDate.split('-');  10:     var literalBirthDates = literalBirthDate.split('-');  11:  12:     var birthDate = new Date(literalBirthDates[2], literalBirthDates[1], literalBirthDates[0]);  13:     var currentDate = new Date(literalCurrentDates[2], literalCurrentDates[1], literalCurrentDates[0]);  14:     var age = currentDate.getFullYear() - birthDate.getFullYear();  15:     return age >= minAge && age <= maxAge  16: });  17:  18: jQuery.validator.unobtrusive.adapters.add("agerange", ["currentdate", "minage", "maxage"], function (options) {  19:     options.rules["agerange"] = {  20:         currentdate: options.params.currentdate,  21:         minage: options.params.minage,  22:         maxage: options.params.maxage  23:     };  24:     options.messages["agerange"] = options.message;  25: });

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索客户端
, 验证
, datetime
, mvc验证
, ValidationAttribute
, 年龄
, MVC极验验证
, 自定义如何实现
验证年龄
,以便于您获取更多的相关知识。

时间: 2025-01-21 00:12:55

ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)的相关文章

mvc4-各位高手求救:ASP.NET MVC 日期范围 自定义验证特性如何实现呢?

问题描述 各位高手求救:ASP.NET MVC 日期范围 自定义验证特性如何实现呢? 各位高手求救:ASP.NET MVC 日期范围 自定义验证特性如何实现呢?想实现一个日期范围自定义验证特性 ASP.NET MVC 自带的RangeAttribute验证不好使?比如:[Display(Name=""出生日期"")][Required(ErrorMessage=""{0}不能为空!"")][Range(typeof(DateT

ASP.NET能否在服务端获取客户端的域登录名,客户端和服务端在同一个域内

问题描述 ASP.NET能否在服务端获取客户端的域登录名,客户端和服务端在同一个域内 解决方案

基于OpenLDAP服务端和客户端的SSL/TLS的配置方法

OpenLDAP 是最常用的目录服务之一,它是一个由开源社区及志愿者开发和管理的一个开源项目,提供了目录服务的所有功能,包括目录搜索.身份认证.安全通道.过滤器等等.大多数的 Linux 发行版里面都带有 OpenLDAP 的安装包.OpenLDAP 服务默认使用非加密的 TCP/IP 协议来接收服务的请求,并将查询结果传回到客户端.由于大多数目录服务都是用于系统的安全认证部分比如:用户登录和身份验证,所以它也支持使用基于 SSL/TLS 的加密协议来保证数据传送的保密性和完整性.OpenLDA

视频-服务端控制客户端Socket

问题描述 服务端控制客户端Socket 服务端如何通过Socket控制客户端在某个定点时刻播放视频,如果有代码的可以分享我吗?谢谢 解决方案 本人也是最近接触Socket,懂得不多,只能给你提供一个思路. 你可以在客户端添加一个线程,使用不同于原来的的Socket Port建立一个通讯, 客户端的那个线程不断接收服务端的回传信息, 根据回传的信息在这个线程中控制你想要的进度. 解决方案二: 首先要让客户端和服务器端游一个长连接,并且要有心跳包来保证accept,之后到时间服务器端给客户端发送一个

Git服务端和客户端安装过程

Git是一个开源的分布式的版本控制系统,由于git分布式体系结构,用户完全可以脱离git服务端在本地查看,编写和提交代码,而且Git的速度也非常快,适合大型,分布式的项目管理.下面是Git服务端和客户端安装的详细步骤. 1.物理环境 Git-server    Centos 5.8   git-1.8.3.tar.gz Git-client    Windows 7    SourceTreesetup.exe 2.Git服务端安装 2.1在http://pan.baidu.com/share/

自己编的SQL服务端加客户端

自己编的SQL服务端加客户端,具有语法解析和简单的数据库操作功能(没有使用MFC的数据库API).界面使用了CJ60Lib类库,语法显示使用了CrystalEdit类 . 登陆帐户:Aministrator: admin admin,可以添加帐户和更改帐户类型. Super User: superuser superuser,可以执行所有的操作. User: user user,只能执行查询功能. 简单功能介绍: 一.资料定义DDL (Data Definition Language) 1.建表

bad file descriptor-使用线程的TCP回射服务端和客户端运行时错误

问题描述 使用线程的TCP回射服务端和客户端运行时错误 服务端serv.c: #include "unp.h" #include <pthread.h> void str_echo(int sockfd) { char buf[MAXLINE]; int n; while(( n = read(sockfd,buf,sizeof(buf)))>=0) { if (n ==0) { printf("client EOF,its use shutdown soc

netty-Netty服务端和客户端的连接保持只有一个

问题描述 Netty服务端和客户端的连接保持只有一个 在实现了服务端和客户端的连接后,客户端每次重启后都和服务端进行重连,导致了一堆的channle的出现.但是只有一个最后一次的channel是有用的,其他都在timeout的时候回收.但是本身建立这么多channel是很费资源的,我如何保证一个客户端只和服务端建立一个长连接,其他都无法建立起来呢.我现在实现的框架是netty,请高手指点 解决方案 http://www.open-open.com/lib/view/open14288901877

聊天室-关于java的聊天程序,分服务端和客户端,请java大神帮我调试一下,我检查没编写错误

问题描述 关于java的聊天程序,分服务端和客户端,请java大神帮我调试一下,我检查没编写错误 //服务端 package chatApp; import java.net.*; import java.io.*; import java.util.*; public class chatserverthree implements Runnable { public static final int PORT=1234; protected ServerSocket listen; stat