概述

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

使用validator校验数据

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

[Table("apple")]
public class Apple
{
public Guid Id {get;set;} [MaxLength(,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+= "数据不合理";
              }
            }
          }

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

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

  1. Golang使用validator进行数据校验及自定义翻译器

    Golang使用validator进行数据校验及自定义翻译器 包下载:go get github.com/go-playground/validator/v10 一.概述 在接口开发经常会遇到一个问题 ...

  2. 使用Hibernate Validator来帮你做数据校验

    数据校验是贯穿所有应用程序层(从表示层到持久层)的常见任务.通常在每个层中实现相同的验证逻辑,这是耗时且容易出错的.这里我们可以使用Hibernate Validator来帮助我处理这项任务.对此,H ...

  3. springboot使用validation 插件做数据校验

    不多说废话. 首先,我们需要在入参实体对象中,使用注解,控制 @Datapublic class UpdateShufflingRequest { private String shuffling_l ...

  4. StringMVC 中如何做数据校验

    步骤一:引入四个jar包 步骤二:注册类型转换器 <context:component-scan base-package="cn.happy.controller"> ...

  5. SpringBoot入门 (十一) 数据校验

    本文记录学习在SpringBoot中做数据校验. 一 什么是数据校验 数据校验就是在应用程序中,对输入进来得数据做语义分析判断,阻挡不符合规则得数据,放行符合规则得数据,以确保被保存得数据符合我们得数 ...

  6. @Valid 数据校验 + 自定义全局异常信息

    关于javax.validation.Validator校验的使用 对于要校验的实体类:其需要校验的字段上需要添加注解 实际例子 使用:首先要拿到 validator的子类 Validator val ...

  7. (32)forms组件(数据校验)

    forms组件的用处 1.就是用来做数据校验的 2.渲染页面 3.渲染错误信息(和局部刷新同效果) 数据校验 要使用forms组件必须要写一个类继承forms组件 urls.py from bbs01 ...

  8. validator库参数校验

    目录 validator库参数校验若干实用技巧 基本示例 翻译校验错误提示信息 自定义错误提示信息的字段名 自定义结构体校验方法 自定义字段校验方法 自定义翻译方法 validator库参数校验若干实 ...

  9. gin使用validator库参数校验若干实用技巧

    validator库参数校验若干实用技巧 本文介绍了使用validator库做参数校验的一些十分实用的使用技巧,包括翻译校验错误提示信息.自定义提示信息的字段名称.自定义校验方法等. validato ...

随机推荐

  1. dell ipmi sol

    http://blog.arnoudvermeer.nl/post/52375062605/howto-setup-ipmi-sol-on-a-dell-r-series-server http:// ...

  2. OpenGL函数解析之glLoadIdentity()

    函数原型:void glLoadIdentity(void) 函数说明:调用glLoadIdentity()函数可以恢复初始坐标系,用一个4x4的单位矩阵来代替当前矩阵,实际上就是对当前矩阵进行初始化 ...

  3. mysql 常用sql操作语句

    获取数据库里所有表 SELECT TABLE_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='数据库名' 获取表里 ...

  4. Magento修改css样式更新之——grunt命令使用

    1.清除pub/static和var中相应文件 2.源头文件重新导入pub/static 3.pub中的less编译 4.字面翻译是跟踪源头文件变化实时编译,但是这里的the source files ...

  5. (笔记)angular Select选择

  6. Sunglasses

    It's hot this summer. It also reminds me of one case about sunglasses. She was new to this company a ...

  7. 二级路由器设置为何要关闭DHCP服务

    因为如果不关闭dhcp的话会和一级路由相冲突,你这个因该是lan口的连接法吧,如果不然的话是不需要关闭dhcp功能的路由器和路由器的连接方法有两种,一种是wan口连,一种是lan口连方法1:WAN口连 ...

  8. 线性回归的Spark实现 [Linear Regression / Machine Learning / Spark]

    1- 问题提出 2- 线性回归 3- 理论推导 4- Python/Spark实现 # -*- coding: utf-8 -*- from pyspark import SparkContext t ...

  9. select 语句占位符

    对于已预备的语句,可以使用位置保持符.以下语句将从tb1表中返回一行: mysql> SET @a=1; mysql> PREPARE STMT FROM "SELECT * F ...

  10. iOS中UIKit——UIButton设置边框

    UIButton *testButton = [UIButton buttonWithType:UIButtonTypeSystem]; [testButton setFrame:CGRectMake ...