数据标注(Data Annotation)是类或类成员添加上下文信息的一种方式,在 C# 通常用特性(Attribute)类来描述。它的用途主要可以分为下面这三类:

  • 验证 Validation:向数据添加验证规则

  • 展现 Display:指定数据如何呈现给用户

  • 模型 Modelling:添加关于用法和与其它类的关系信息

下面是一个用来验证和展现用户信息的一个 Model:

class Kid
{[Range(0, 18)] // 年龄不能超过18岁,不能为负数public int Age { get; set; }[StringLength(MaximumLength = 50, MinimumLength = 3)] // 名称的长度不能超过 50,不能小于 3public string Name { get; set; }[DataType(DataType.Date)] // 生日将作为日期展示 (不带时间)public DateTime Birthday { get; set; }
}

数据标注的展现的用途主要在早期的 ASP.NET 和 ASP.NET MVC 等框架中使用。例如,在 ASP.NET MVC 中,Razor 引擎会根据 Model 属性的 DataType 特性动态生成不同类型的表单元素。不过,现在这类用途除了 WPF(比如 EditableAttribute)已经过时很少用了。

数据标注用来验证数据的合法性是最常见的用法,在 ASP.NET Core/Mvc 中,数据作为表单 Model 提交时,框架会对 Model 数据自动进行校验,也可以手动调用 ModelState.IsValid() 来判断数据是否合法。

自定义校验特性

自定义一个校验特性很简单,创建一个继承 ValidationAttribute 的类,然后重写它的 IsValid 方法。示例:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class EvenNumberAttribute : ValidationAttribute
{public override bool IsValid(object input){if (input == null)return false;if (!int.TryParse(input.ToString(), out int val))return false;return val % 2 == 0;}
}

然后这个特性可以这么用:

public class Model
{[EvenNumberAttribute(ErrorMessage = "数字必须是偶数")]public int MyNumber { get; set; }
}

除了这自定义校验的方式,C# 还提供了一个 CustomValidation 特性,也是用来自定义数据校验的,它是通过反射的方式来实现的。示例:

public class Model
{[CustomValidation(typeof(MyCustomValidation), "IsNotEvenNumber")]public int MyNumber { get; set; }
}public static class MyCustomValidation
{public static ValidationResult IsNotEvenNumber(object input){var result = new ValidationResult("数字必须是偶数");if (input == null || !int.TryParse(input.ToString(), out int val))return result;return val % 2 == 0 ? ValidationResult.Success : result;}
}

C# 内置了很多常用数据校验特性类,比如最常用的 RequiredAttributeStringLengthAttributeRangeAttribute 等。

手动执行数据校验

大多数时候,数据校验都是由框架(如 ASP.NET Core)帮我们做了,但有时候我们想手动执行校验数据怎么做呢?简单说,使用 Validator 类即可,但也不是想像的那么直接。数据校验需要提供检验的信息,比如校验规则、需要校验的属性及未通过显示的错误信息等,而这些需要由另一个类来从待校验的实例中提取作为上下文,它是 ValidationContext,所以需要先创建 ValidationContext 对象:

ValidationContext vc = new ValidationContext(objectToValidate);

创建好这个上下文对象就可以对数据进行多种方式的校验了,比如校验对象的所有属性:

ValidationContext vc = new ValidationContext(objectToValidate);
ICollection<ValidationResult> results = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject(objectToValidate, vc, results, true);

也可以只校验对象的指定属性:

ValidationContext vc = new ValidationContext(objectToValidate);
ICollection<ValidationResult> results = new List<ValidationResult>();
bool isValid = Validator.TryValidatePropery(objectToValidate.PropertyToValidate, vc, results, true);

返回值 isValid 表示是否所有数据都验证通过,验证失败的信息会放到 results 结果集。

看到这,我觉得手动执行校验还是有点麻烦,创建 ValidationContext 对象这一步如果也封装在 Validator 类的方法内,岂不是简洁一些?

-

精致码农

带你洞悉编程与架构

↑长按图片识别二维码关注,不要错过网海相遇的缘分

[C#.NET 拾遗补漏]09:数据标注与数据校验相关推荐

  1. 什么是数据标注? 数据标注公司主要做什么?

    一.什么是数据标注? 1.数据标注定义 数据标注是对未经处理的语音.图片.文本.视频等数据进行加工处理, 并转换为机器可识别信息的过程.原始数据一般通过数据采集获得, 随后的数据标注相当于对数据进行加 ...

  2. wpf datagrid 数据为null时 显示背景图_[C#.NET 拾遗补漏]09:数据标注与数据校验

    数据标注(Data Annotation)是类或类成员添加上下文信息的一种方式,在 C# 通常用特性(Attribute)类来描述.它的用途主要可以分为下面这三类: 验证 Validation:向数据 ...

  3. 实战案例丨ModelArts在数据标注、数据过滤上的应用技巧:自动分组

    分组标注场景 大量复杂.乱序的图片依次标注效率极低,如果一次可以标注一大片的图片将极大地提升标注效率. 自动分组识别并提取图像特征,通过ModelArts先进的聚类算法可以将所有图片分组:将特征相似的 ...

  4. 图像/视频数据标注工具

    十个最常用深度学习图像/视频数据标注工具 原创: gloomyfish OpenCV学堂 从此以后图像与视频数据标注不用为找工具发愁!好东西记得分享 图像数据标注概述 在深度学习领域,训练数据对训练结 ...

  5. “智能”基石:人工智能数据标注与训练,是决定智能时代的第一步

    记者 | 邓晓娟 2021年5月20日~23日,由深圳市科学技术协会.深圳市商务局.深圳市福田区人民政府共同指导,深圳市科技开发交流中心.深圳市人工智能行业协会联合主办的2021第二届深圳国际人工智能 ...

  6. 有多少智能,就有多少人工?人工智能背后的数据标注师

    "目前我国已有庞大的数据加工队伍,仅北京就有一百多家专门从事数据标注的公司,全国从事这项工作的人大概超过千万,很多头部的互联网技术企业都有自己的数据标注公司." 目前人工智能落地场 ...

  7. 数据标注-人工智能高速路上的基石

    数据标注-人工智能高速路上的基石 中国科学技术大学博士袁岚峰在不久前的文章中把中国科技在世界的地位大致分为五类. 我们本文中只引用第四类. "如今世界科技的第四个格局:双头格局,一般是中美两 ...

  8. 揭秘人工智能背后鲜为人知的人工力量——数据标注

    来源:帮尼资讯 部分参考来源:大数据文摘.点宽DigQuant 图片来源:网络 尽管随着AI的普及,我们在生活中越来越依赖于人工智能,但"人工智障"的相关调侃也从来没有消失过. 相 ...

  9. lisp 线性标注自动避让_《数据标注工程》第一章学习笔记及作业:数据标注概述...

    第一章:数据标注概述 一.数据标注的起源与发展 1.人工智能行业的发展 AI的概念:意指让机器具有像人一般的智能行为(1956年,达特茅斯会议,由约翰·麦卡锡提出) AI的发展:60多年来,浮浮沉沉. ...

最新文章

  1. HDU 5298 Solid Geometry Homework 暴力
  2. Html制作知识库管理系统,HTML 编辑器
  3. RabbitMQ整合SpringBoot(web)
  4. [转载] Comet:基于 HTTP 长连接的“服务器推”技术
  5. 软件工程 四则运算(结对编程)
  6. 鸿蒙系统的正式推送范围,华为鸿蒙系统或6月正式推送升级,手机版已开始小范围推送...
  7. group policy client服务未能登录,拒绝访问
  8. 单位计算机安全和保密措施,安全管理及保密措施
  9. java后台调用webservice接口常用方式
  10. jeston nano usb转485通信,usb扩展连接多个设备设置固定
  11. 磁盘阵列恢复方法以及注意事项
  12. 如何打造一款火遍国内外的自走棋手游?我们跟《战歌竞技场》的美术和程序聊了聊
  13. SpringMVC+LayUI 交通事故管理系统
  14. 深圳市集体户户口簿首页pdf版获取指南
  15. 使用java压缩文件成zip——三种方式压缩文件速度对比
  16. checkbox 选中_山西男篮热身赛两胜江苏 张宁首秀表现不俗 为什么会选中他?
  17. 【JY】45天缩短到4天,突发性Fluent仿真任务怎么破?
  18. vue中echarts使用案例:饼图(可直接使用)
  19. 【UV打印机】RYPC打印软件教程(三)-参数设置
  20. 资产管理业务和财富管理

热门文章

  1. IntelliJ IDEA代码分屏显示
  2. Winform定时启动
  3. 数据结构(java语言描述)顺序栈的使用
  4. 一道有意思的导论问题
  5. [导入]Asp.net中动态在中加入Scrpit标签
  6. JAVA配置Tomcat
  7. Linux入门之进程管理(4)之进程与文件
  8. [MySQL]关于amd.dll后门病毒入侵3306端口的临时解决方案
  9. IOS开发CAKeyframeAnimation的基本使用与keypath的列举
  10. php 数组什么情况下是空的?