asp.net mvc3 数据验证(三)—自定义数据注解

原文:asp.net mvc3 数据验证(三)—自定义数据注解

        前两节讲的都是asp.net mvc3预先设定的数据注解,但是系统自由的数据注解肯定不适合所有的场合,所以有时候我们需要自定义数据注解。

        自定义数据注解有两种,一种是直接写在模型对象中,这样做的好处是验证时只需要关心一种模型对象的验证逻辑,缺点也是显而易见的,那就是不能重用。

                                            还有一种是封装在自定义的数据注解中,优点是可重用,缺点是需要应对不同类型的模型。

        现在我们以封装在自定义数据注解中的方法为例看下如何在asp.net mvc3中自定义数据注解以及使用。

 

一、自定义属性级别的验证

        首先,所有的数据注解都应继承于System.ComponentModel.DataAnnotations命名空间中的ValidationAttribute类。

            重写其protected virtual ValidationResult IsValid(object value, ValidationContext validationContext);

例如:

        我们需要写一个UserName不能超过10个字母的数据注解(你可能会说这不是有的StringLength么,好吧,仅以此为例,我真没想到其他的需要自定义数据注解的好例子)。

        (1)新建一个类MaxLengthAttribute,代码如下:

    public class MyMaxLengthAttribute : ValidationAttribute
    {
        private readonly int MaxLength;

        public MyMaxLengthAttribute(int maxLength)
        {
            MaxLength = maxLength;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            string content = value.ToString();
            if (content.Length > MaxLength)
            {
                return new ValidationResult("输入的字符太多了!^_^");
            }
            return ValidationResult.Success;
            //return base.IsValid(value, validationContext);
        }

        第二步就是像正常使用asp.net自带的数据注解一样使用,如:

        

        [Required(ErrorMessageResourceType=typeof(ErrorMessage),ErrorMessageResourceName="UserRequire")]
        [Display(Name = "用户名")]
        [MyMaxLengthAttribute(10)]
        [Remote("CheckUserName","Account", HttpMethod="POST")]
        public string UserName { get; set; }

        好了,只需要这样简单的两步就可以实现了。

验证结果:

        对于自定义的数据注解由于是继承于System.ComponentModel.DataAnnotations命名空间中的ValidationAttribute类,所以它的一些属性也可以使用,比如ErrorMessage,如:

        [Required(ErrorMessageResourceType=typeof(ErrorMessage),ErrorMessageResourceName="UserRequire")]
        [Display(Name = "用户名")]
        [MyMaxLengthAttribute(10,ErrorMessage="{0}字数太多")]
        [Remote("CheckUserName","Account", HttpMethod="POST")]
        public string UserName { get; set; }

        需要注意的是,自定义的数据注解不支持客户端验证,所有的数据需要提交之后再服务端验证,所以如果要同时实现客户端验证需要自己写js验证。

 

但是这样的验证有一个问题,就是默认的验证信息不能实现直接显示Display Name,所以需要如下更改:

    public class MyMaxLengthAttribute : ValidationAttribute
    {
        private readonly int MaxLength;

        public MyMaxLengthAttribute(int maxLength ):base("{0}的字符太多了!")
        {
            MaxLength = maxLength;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            string content = value.ToString();
            if (content.Length > MaxLength)
            {
                //return new ValidationResult("输入的字符太多了!^_^");
                string errorMessage = FormatErrorMessage(validationContext.DisplayName);
                return new ValidationResult(errorMessage);
            }
            return ValidationResult.Success;
            //return base.IsValid(value, validationContext);
        }
    }

 

 验证结果:

 

二、自定义Model级别的验证(IValidatableObject)

        这个接口是为了实现Model的自验证(self-validating)的,是asp.net mvc3 新增的验证特性。这个特性和普通数据注解的区别是普通数据注解仅仅只能验证Model的一个属性,而实现了IValidatableObject接口的自验证则在Model的级别来验证,比如验证Model的几个属性之间的关系等。

        例如,我要验证两次输入的密码相同(好吧,我又把系统自带的验证再写一遍)。

        (1)首先,要将需要验证的Model实现IValidatableObject接口。

     public class RegisterModel : IValidatableObject

        (2)在Model中实现Validate方法:

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContent)
        {
            if (Password != ConfirmPassword)
            {
                yield return new ValidationResult("两次输入的密码不同!", new[] { "Password" });
            }
        }

 

        这个方法在提交Model时会自动验证两次输入的密码是否相同,如果不同则会提示,如下:

 

注意:1、自验证只能把方法写在需要验证的Model中,所以这种自验证的代码无法重用;

            2、自验证的返回值是IEnumerable<ValidationResult>,而不是ValidationResult,所以返回值可以不止一个验证错误。

            3、Validate方法没有传入value参数,也就是意味着Validate方法可以直接访问Model中的属性值。

            4、返回值使用的是yield return来构建枚举返回值,第二个参数是指定错误信息绑定的属性,因为是string数组,所以可以关联多个属性。

 

顺便把练习用的源码分享了,Model部分主要在RegisterModel,下载请点击:http://pan.baidu.com/share/link?shareid=143863&uk=4044128861

时间: 2024-11-18 10:01:19

asp.net mvc3 数据验证(三)—自定义数据注解的相关文章

大数据时代三种数据成摆设

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 在这个人人都高喊"大数据时代"的今天,数据似乎被提到一个前所未有的高度.无论是个人站长还是大中型公司,亦或是大型跨国集团,无论是网络营销还是线下的市场营销都在意识到数据的重要性,凡是都以数据来说话.但是,据小生了解,在很多中小型公司和个人站长中,对于数据重视有余,却利用不足.首先声明,本文在数据高手面前,都有点多余,都是小

行为数据交易三定律

行为数据交易三定律 数据交易有什么特点呢?刘鹏谈了自己对于数据交易的认识,并总结为以下三定律: l 第一定律,数据只能交易,不能交换或者共享: 数据共享的事件似乎正在发生,各公司之间在相互的交换数据,希望能够对彼此的业务产生一些贡献.但事实上,结果只有两种:一种是在线上系统进行大规模数据 共享交换的案例,这种只存在于有投资关系(即母公司和子公司控股关系)以后才会发生的数据交换,定价或者交易实际上发生在更高的资本之间.另一种,很多人 的交换或者共享,这种的结果往往不会有下文,大家只是相互测一下数据

asp.net mvc3 数据验证(四)—Remote验证的一个注意事项

原文:asp.net mvc3 数据验证(四)-Remote验证的一个注意事项         前几篇把asp.net mvc3 中基于Model的主要数据验证的方法都已经讲完了,本节纯粹只是讲一个我曾经遇到的问题,因为和数据验证相关,所以就放在了这系列的文章中.         经过前几篇文章的分享,大家应该觉得asp.net 自带的Remote远程数据注解比较好用,但是我在实际使用中却遇到了问题.         首先,一般来说对于一个属性的验证可能需要不止一个的远程验证,比如对于用户名来说

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(33)-数据验证共享

原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(33)-数据验证共享 注:本节阅读需要有MVC 自定义验证的基础,否则比较吃力 一直以来表单的验证都是不可或缺的,微软的东西还是做得比较人性化的,从webform到MVC,都做到了双向验证 单单的用js实现的前端验证是极其不安全的,所以本次我们来看看MVC上的自带的注解验证,自定义验证 同样的MVC提供了一系列内置的数据验证注解 不为空验证  [Required(ErrorMessage = "不能为空

ASP.NET MVC 数据验证及相关内容_实用技巧

一.数据验证 数据验证的步骤在模型类中添加与验证相关的特性标记在客户端导入与验证相关的js文件和css文件使用与验证相关的Html辅助方法在服务器端判断是否通过服务器端验证常用的验证标记 Required:非空验证StringLength:验证字符串的长度RegularExpression:正则表达式验证Compare:比较两个字段的值是否相等Range:范围验证Remote:服务器验证(需要在controller中编写返回值为JsonResult的Action)自定义验证标记与验证相关的js文

ExtJs 备忘录(3)—— Form表单(三) [ 数据验证 ]

前言 本章主要讲ExtJS表单验证方面,正好趁着周末多写两篇,一边梳理之前用过的代码,一边就地取材补充相关方面的资料,算是温习+补习吧 : ) 系列 1. ExtJs 备忘录(1)-- Form表单(一) [ 控件使用 ] 2. ExtJs 备忘录(2)-- Form表单(二) [ 控件封装 ] 3. ExtJs 备忘录(3)-- Form表单(三) [ 数据验证 ] 推荐 1. ExtJS中表单验证使用自定义vtype示例  2. ExtJs2.0学习系列(5)--Ext.FormPanel之

请问一下asp.net mvc3怎么实现将上传的excel表格的数据导入sql server数据库?

问题描述 请问一下asp.net mvc3怎么实现将上传的excel表格的数据导入sql server数据库? 现在有一个项目,是要求用户上传一个excel文件,系统后台实现将上传的数据写到数据库相应的表中~请大声多多指教 解决方案 asp.net:上传excel表格到SQL Server数据库asp.net 将EXCEL表格数据导入到SQL Server数据库asp.net中Excel导入sql server数据库---------------------- 解决方案二: 这问题太简单了...

ASP.NET MVC5 网站开发框架模型、数据存储、业务逻辑(三)_实用技巧

前面项目的层次和调用关系都说明了,关系如下图 采用三层架构的时候,研究过BLL层的必要性,觉得业务逻辑完全可以在controller里实现,没有必要单独做一个项目,另一个分层多了会影响性能.后来我还是把业务逻辑独立出来,原因如下: 业务逻辑写进controller里代码看着比较混乱,时间久了代码容易理不清. 在controller里直接写逻辑重复代码会不较多,开发效率低. 分项目有利于代码重用,有时候可以直接拿到其他项目中稍作修改就可以用. 对于性能我觉得分层多了肯定会有影响,但是不会很大.现在

ASP.NET MVC结合jQuery插件进行数据验证

jQuery Validation是一个强大的数据验证插件,该插件支持"validation rule"即验证规则,规则将对表单内的输入控件进行控制或约束,譬如"本项必填","本项不能少于n个字符",或者"这不是一个有效的email地址" 等等.这些规则大多数和asp.net本身的验证控件类似.遗憾的是asp.net本身的验证控件不能在MVC框架下工作,因为服务器端控件受页面的 ViewState限制,而MVC框架是没有Vie