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

简介: 原文:asp.net mvc3 数据验证(三)—自定义数据注解        前两节讲的都是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
目录
相关文章
|
2月前
|
JSON 安全 API
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
53 13
|
4月前
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
71 2
|
4月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
4月前
|
前端开发 Java 数据库
springBoot:template engine&自定义一个mvc&后端给前端传数据&增删改查 (三)
本文介绍了如何自定义一个 MVC 框架,包括后端向前端传递数据、前后端代理配置、实现增删改查功能以及分页查询。详细展示了代码示例,从配置文件到控制器、服务层和数据访问层的实现,帮助开发者快速理解和应用。
|
6月前
|
开发框架 .NET Docker
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
|
6月前
|
开发框架 .NET 数据库连接
闲话 Asp.Net Core 数据校验(三)EF Core 集成 FluentValidation 校验数据例子
闲话 Asp.Net Core 数据校验(三)EF Core 集成 FluentValidation 校验数据例子
116 1
|
6月前
|
JSON 前端开发 Java
Spring MVC返回JSON数据
综上所述,Spring MVC提供了灵活、强大的方式来支持返回JSON数据,从直接使用 `@ResponseBody`及 `@RestController`注解,到通过配置消息转换器和异常处理器,开发人员可以根据具体需求选择合适的实现方式。
213 4
|
7月前
|
开发框架 JSON 前端开发
利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
|
6月前
|
开发框架 前端开发 算法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
110 0

热门文章

最新文章