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

asp.net mvc3 数据验证(三)—自定义数据注解,布布扣,bubuko.com

时间: 2024-12-18 21:44:08

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

ASP.NET MVC3 Model验证总结

原文:ASP.NET MVC3 Model验证总结 http://www.wyjexplorer.cn/Post/2012/8/3/model-validation-in-aspnet-mvc3 ASP.NET MVC3中的Model是自验证的,这是通过.NET4的System.ComponentModel.DataAnnotations命名空间完成的. 我们要做的只是给Model类的各属性加上对应的验证标记(Attributes)就可以让MVC3框架帮我们完成验证.我以MVC3项目模板自带的登

ASP.NET MVC Model验证(三)

ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的Model验证是在哪个具体的方法中来执行的,本篇的主题就是模拟一下默认的实现,自定义个Model绑定器继承自DefaultModelBinder类型,并且重写某些个重要的方法. Model验证 Model验证简单运用示例 ModelValidator使用生成过程 自定义实现DefaultModelBi

Linechart + Datagrid 互动展示数据 (Linechart自定义数据点选择线)

如上图示,在linechart中添加红色Y线,拖动该线的过程中,经过数据点时,会实时更新datagrid中对应的X.Y值数据. 实现要点: 1.linechart添加Y线 继承mx.charts.chartClasses.ChartElement,自定义Y线. package { import flash.display.Graphics; import flash.geom.Point; import flash.text.TextField; import mx.charts.chartCl

数据验证(自定义特性)

这几天在了解ef,看了几天云里雾里(我太菜了),但在vs2010中使用ef时我觉得有些东西还是很有意思的.自己便想到分装一个逻辑层的数据验证类 1.自定义特性 [AttributeUsage(AttributeTargets.Property)] public class CheckAttributes:Attribute { // 摘要: // 初始化类的新实例. public CheckAttributes(bool iskey, bool isnull) { this.EntityKeyP

我这么玩Web Api(二):数据验证,全局数据验证与单元测试

目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试   一.模型状态 - ModelState 我理解的ModelState是微软在ASP.NET MVC中提出的一种新机制,它主要实现以下几个功能: 1. 保存客户端传过来的数据,如果验证不通过,把数据返回到客户端,这样可以保存用户输入,不需要重新输入. 2. 验证数据,以及保存数据对应的错误信息. 3. 微软的一种DRY(Don't Repeat

转:ASP.NET MVC3 Model验证总结

http://www.wyjexplorer.cn/Post/2012/8/3/model-validation-in-aspnet-mvc3 ASP.NET MVC3中的Model是自验证的,这是通过.NET4的System.ComponentModel.DataAnnotations命名空间完成的. 我们要做的只是给Model类的各属性加上对应的验证标记(Attributes)就可以让MVC3框架帮我们完成验证.我以MVC3项目模板自带的登录 做例子讲解Model的验证. 一.启用客户端验证

在ASP.NET MVC3项目中,自定义404错误页面

在Web开发中,用户体验是至关重要的,一个友好的网站自然少不了自定义404错误页面. 让笔者为大家介绍404错误页面在ASP.NET MVC3项目中的配置: 第一步,在项目的Web.config文件中找到节点<system.web> 在此节点下添加配置        <customErrors mode="On" defaultRedirect="~/Index/Error404">          <error statusCode

atitit.数据验证--db数据库数据验证约束

1. 为了加强账户数据金额的安全性,需要增加验证字段..1 2. 创建帐户1 3. 更改账户2 4. ---code3 5. --fini4 1. 为了加强账户数据金额的安全性,需要增加验证字段.. 调用:: 在创建,更改金额的时候,都要更改前验证... 更改金额的时候,还要严重数据库里面的数据准确性 更改时的加密数据从哪里来,直接从校验器来就是了.. new SqlCheckor().getValideVal(new_money); 作者::  ★(attilax)>>>   绰号:老

记录一下SparkStreaming中因为使用redis做数据验证而导致数据结果不对的问题

先说业务, 在flatMap阶段,当前指标会在redis去验证数据是否是新用户,如果是新用户,那么进行统计,统计会将该新用户add至我们的redis容器中... 这个业务其实很简单...但坑自己的是,flatMap后的RDD,会被两个不同的action使用... 然后...我发现第二个action中永远是统计不到新用户了..... 不知道大家看出来问题的原因了吗?  我TMD排查一天才找到原因. 因为flatMap是个transform,每次action才会执行. 而我执行两次action那么f

初识大数据(三. 大数据与人工智能的关系)

大数据与人工智能有什么关系呢?AI本身就是一种大数据的应用,特别是在对于AI系统进行训练的时候,使用的数据越多,AI系统就越先进.也就是说对于人工智能系统进行训练使用的数据量越大,数据质量越好,人工智能系统的质量就越高,从这个意义上来说AI本身也是一种大数据应用.        机器学习是人工智能的子集,深度学习是机器学习的子集,但是深度学习的影响是最大的,比如图像识别.语音识别.语义识别.   常用框架: 1. Scikit-Learn: 基于 Python 语言的机器学习工具, 该算法库显得