概述

在把用户输入的数据存储到数据库之前一般都要对数据做服务端校验,于是想到了.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. Duilib扩展《01》— 双击、右键消息扩展

    用过duilib的可能会发现,duilib中有些控件没能很好的区分左键.右键等消息.所以根据实际需要,我们需要进行相关区分处理,或者自行扩展. 一. 左键.右键消息区分 我们以CListUI控件来分析 ...

  2. 571亿背后:DRC助阿里实现异地双活

    571亿背后:DRC助阿里实现异地双活 赶集网SQL自动上线

  3. 使用c#数据库连接池

    摘自: http://www.wxphp.com/wxd_0fetn2bw2548fsc2ak8h_1.html 导读:使用C#数据库连接池,连接到数据库服务器通常由几个需要软长时间的步骤组成,必须与 ...

  4. 码农谷 球从M米高度自由下落第N次落地时反弹的高度

    题目描述 一球从M米高度自由下落,每次落地后返回原高度的一半,再落下.它在第N次落地时反弹多高?共经过多少米? 保留两位小数. 输入描述 M N 输出描述 它在第N次落地时反弹多高?共经过多少米? 保 ...

  5. iOS 微信支付平台集成

    https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_5

  6. c++对象模型以及内存布局的研究

    先引出问题,看一段代码: #include <iostream> using namespace std; class A { }; class B { public: B() {} ~B ...

  7. Oracle中rownum的用法

    rownum是Oracle对查询结果进行顺序编号,第一行分配1,第二行2,以此类推.rownum不能以任何表的名称作为前缀. rownum这个伪字段可以用于控制返回的记录行数. 例如表:student ...

  8. 判断字符串是否包含字母‘k’或者‘K’

    判断字符串是否包含字母‘k’或者‘K’ public bool IsIncludeK(string temp) { temp = temp.ToLower(); if (temp.Contains(' ...

  9. 日志处理--Logo4Net与文件的并发处理

    本文参考自:http://www.cnblogs.com/jiekzou/ 多线程操作同一个文件时会出现并发问题.解决的一个办法就是给文件加锁(lock),但是这样的话,一个线程操作文件时,其它的都得 ...

  10. js生成有缩进的表格

    项目中用到用了两天时间想到的,记录下来,如有更好的方法,留言给我,谢谢! js做如下表格: json [{"id":302,"serviceId":15,&qu ...