概述

在把用户输入的数据存储到数据库之前一般都要对数据做服务端校验,于是想到了.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. iOS 根据字符串来定位地址

    - (void)viewDidLoad { [super viewDidLoad]; self.geocoder = [[CLGeocoder alloc]init]; // 设置地图可缩放 self ...

  2. angular $apply()以及$digest()讲解1

    一些知名的批评和缺陷.他们都涉及到$digest loop(更新周期)中一个很常见的问题:如何在Angular之外更新$scope? 在哪调用 $apply? 更佳的做法是确保你是在$digest l ...

  3. Recover damage pictures to see the crime scene

    Few people know that when you take photos there is also a thumbnail embeded inside the file, even so ...

  4. PUTTY使用Ctrl+s僵死的问题

    算是分享个小经验吧! 一直都是使用VM+PUTTY的方式调试Linux程序,有时候在Vi中编辑了程序,Windowns下旧习难改,顺手就Ctrl+s了,尽管我知道Vi的保存是:w. 很不幸这时的PUT ...

  5. 动态设置屏幕icon

    REPORT demo_dynpro_status_icons.     DATA value TYPE i VALUE 1.     DATA: status_icon TYPE icons-tex ...

  6. Django搭建及源码分析(一)

    一.关于Django以下两个站点,在使用方面有详细说明. http://www.nowamagic.net/academy/part/13/286 http://www.w3cschool.cc/dj ...

  7. CDH 不能监控hadoop状态

    1 背景:公司集群整体搬迁 2 问题:hadoop重启后,发现一个非常坑爹的问题.用 hadoop dfsadmin -report 查看datanode状态完全正常,但是Cloudera Manag ...

  8. firefox 扩展开发笔记(三):高级ui交互编程

    firefox 扩展开发笔记(三):高级ui交互编程 前言 前两篇链接 1:firefox 扩展开发笔记(一):jpm 使用实践以及调试 2:firefox 扩展开发笔记(二):进阶开发之移动设备模拟 ...

  9. hihoCoder-1000-A+B

    题目描述:传统的A+B题 使用语言:C 代码: #include <stdio.h> int main(void){ int a,b; while((scanf("%d %d&q ...

  10. WPF之旅(二)- XAML

    什么是XAML XAML(Extensible Application Markup Lanaguage的简写,发音“zammel”)是用于实例化.NET对象的标记语言.尽管XAML是一种可以用于诸多 ...