.net 使用validator做数据校验

概述

在把用户输入的数据存储到数据库之前一般都要对数据做服务端校验,于是想到了.net自带的数据校验框架validator。本文对validator的使用方法进行介绍,并分析下校验的的原理。

使用validator校验数据

首先我们创建一个需要校验的实体类代码如下:

[Table("apple")]
    public class Apple
    {
        public Guid Id {get;set;}

        [MaxLength(3,ErrorMessage="名称长度不能超过3个")]
        public string Name {get;set;}

        public string Comment {get;set;}

        public virtual ICollection<Banana> Bananas { get; set; }

    }

我们在Name属性添加了一个校验元数据MaxLength。

然后使用下面的代码对数据进行校验:

  Apple apple = new Apple(){Name = "tes你"};
  string strLength = "";

  List<ValidationResult> results = new List<ValidationResult>();
            ValidationContext validateContext = new ValidationContext(apple);

            if (Validator.TryValidateObject(apple, validateContext, results, true))
            {
                strLength = "it is ok!";
            }

校验失败会在 results中出现错误信息。

自定义校验方法

例如上面的例子,如果我们希望是按字节数来校验数据,而不是字符串长度。我们就需要对校验方法进行扩张并自定义实现校验方法了。扩展校验方法的代码如下:

public class NewMaxLengthAttribute : MaxLengthAttribute
    {
        public NewMaxLengthAttribute()
            : base()
        { }

        public NewMaxLengthAttribute(int length)
            : base(length)
        { }

        public override bool IsValid(object value)
        {
            if (value != null && value is string  )
            {
                int byteLength = System.Text.Encoding.Default.GetByteCount(value.ToString());
                if (  byteLength > base.Length )
                {
                    return false;
                }
            }
            return true;
        }
    }

对MaxLengthAttribute进行继承,并重载校验方法IsValid即可。

validator实现原理分析

模拟validator代码如下:

          Apple apple = new Apple(){Name = "tes你"};                  Type typeForTest = apple.GetType();
                foreach (PropertyInfo ai in typeForTest.GetProperties())
                {
                    var test = ai.GetCustomAttribute(typeof(MaxLengthAttribute), false) as MaxLengthAttribute;
                    var aiType = ai.GetType();
                    if (test != null && ai.PropertyType.Name.Equals("String"))
                    {
                        var length = test.Length;
                        var propertyValue = ai.GetValue(apple).ToString();
                        int byteLength = System.Text.Encoding.Default.GetByteCount(propertyValue);
                        if (length >= byteLength)
                        {
                            res+= " OK";
                        }
                        else
                        {                res+= "数据不合理";               }             }           }

利用反射读取实体的属性上定义的元数据信息,然后对数据进行校验。

时间: 2024-08-12 10:41:29

.net 使用validator做数据校验的相关文章

pt-table-checksum 针对某个库做数据校验

背景: 我们现在需要对线上主库(简称A)6个备库中的某个库(简称B)做数据校验: 方式:pt-table-checksum工具 <1> 第一步需要配置dsns,这样可以指定备库校验 在A库上某个库中: CREATE TABLE `dsns` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_id` int(11) DEFAULT NULL, `dsn` varchar(255) NOT NULL, PRIMARY KEY (`id`) ); INS

StringMVC 中如何做数据校验

步骤一:引入四个jar包 步骤二:注册类型转换器 <context:component-scan base-package="cn.happy.controller"></context:component-scan> <!-- 配置验证器 --> <bean id="myvalidator" class="org.springframework.validation.beanvalidation.LocalVal

数据校验validator 与 DWZ

在做系统时经常会用到数据校验,数据校验可以自己写,也可以用现在成的,现在记录下两种类库使用方法, validator <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="pragma" content="n

用spring的@Validated注解和org.hibernate.validator.constraints.*的一些注解在后台完成数据校验

这个demo主要是让spring的@Validated注解和hibernate支持JSR数据校验的一些注解结合起来,完成数据校验.这个demo用的是springboot. 首先domain对象Foo的代码如下: package com.entity; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.NotBlank; import javax.validati

脚本中如何做填报数据校验

在很多填报表项目的开发过程中,为了保证数据规范且有效,常会在报表中设置各种校验以达到目的,比如:工资金额最多只允许包含两位小数.邮政编码必须是全数字组成的 6 位数且首位数字不能是 0 ,等等.这些要求,我们都可以利用报表工具提供的数据类型校验.单元格校验等手段来实现,但是总有“意外”情况出现,比如:小计校验要求分组内的各值相加等于分组小计,这种类型的校验有什么难点?怎么实现?下面我们举例实际看一下. 首先,了解基本情况及要求: 展现效果: 要求: 报表数据来源于数据库,其中 A 列指标名称是从

SpringMVC框架下数据的增删改查,数据类型转换,数据格式化,数据校验,错误输入的消息回显

在eclipse中javaEE环境下: 这儿并没有连接数据库,而是将数据存放在map集合中: 将各种架包导入lib下... web.xml文件配置为 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/

【SpringMVC学习06】SpringMVC中的数据校验

这一篇博文主要总结一下springmvc中对数据的校验.在实际中,通常使用较多是前端的校验,比如页面中js校验,对于安全要求较高的建议在服务端也要进行校验.服务端校验可以是在控制层conroller,也可以是在业务层service,controller校验页面请求的参数的合法性,在服务端控制层conroller的校验,不区分客户端类型(浏览器.手机客户端.远程调用):service层主要校验关键业务参数,仅限于service接口中使用的参数.这里主要总结一下何如使用springmvc中contr

SpringMVC——数据校验

数据校验在web应用里是非常重要的功能,尤其是在表单输入中.在这里采用Hibernate-Validator进行校验,该方法实现了JSR-303验证框架支持注解风格的验证. 一.导入jar包 若要实现数据校验功能,需要导入必要的jar包,主要包括以下几个: classmate-1.3.1.jar hibernate-validator-5.4.1.Final.jar hibernate-validator-annotation-processor-5.4.1.Final.jar hibernat

深入分析JavaWeb Item46 -- Struts2数据校验与国际化

1.用户输入数据的校验 1.校验方式 a:客户端校验.(防君子防不了小人)在页面中写js脚本. 这样做的好处是: 输入错误的话提醒比较及时: 减轻服务器的压力 b.服务器端校验. 数据安全 ,整个应用阻止非法数据的最后防线 而在实际开发中通常选择:a+b 2.服务器端数据校验: 1.编程式校验:自己Action中编写一个校验代码(缺点:验证规则都写在了代码中) 前提:动作类继承ActionSupport,重写Validateable接口中的validate()方法 ,在该方法中完成验证. 步骤如