如何在 C# 中使用 数据注解

数据注解 是一种可以应用到 类 或者 类成员上用来指定类之间关系的一种 Attribute,它的应用场景比较多,可用来描述 UI 上如何进行数据展示,还可以用来做类属性的规则验证,这篇文章就来讨论为什么 注解 值得你去学习,以及如何在 .NET Core 中使用。

使用 System.ComponentModel.DataAnnotations

要想运行本篇的例子,需要将 System.ComponentModel.DataAnnotations 引用到项目中。

值得注意的是,Attribute 常用来给 class 或者 property 标注元数据信息,很显然  注解 Atrribute 也是 Attribute 的一种,它的分类大概有以下几种。

  • Validation attribute

从名字上就能看出,主要用在 实体属性上,目的是用来管控 属性值 的有效性。

  • Display attribute

用来指定数据如何在 UI 上展示。

  • Modeling attribute

用来指定类之间的关系。

理解 数据注解 类

System.ComponentModel.Annotations 命名空间下有如下几个注解类。

  • ConcurrencyCheck

  • Key

  • MaxLength

  • Required

  • StringLength

  • Timestamp

数据注解 案例展示

现在新建一个 Author 类,代码如下:

public class Author{[Required(ErrorMessage = "{0} is required")][StringLength(50, MinimumLength = 3,ErrorMessage = "First Name should be minimum 3 characters and a maximum of 50 characters")][DataType(DataType.Text)]public string FirstName { get; set; }[Required(ErrorMessage = "{0} is required")][StringLength(50, MinimumLength = 3,ErrorMessage = "Last Name should be minimum 3 characters and a maximum of 50 characters")][DataType(DataType.Text)]public string LastName { get; set; }[DataType(DataType.PhoneNumber)][Phone]public string PhoneNumber { get; set; }[DataType(DataType.EmailAddress)][EmailAddress]public string Email { get; set; }}

下面的代码片段展示了如何给 Author 的属性赋值。

Author author = new Author();author.FirstName = "Joydip";author.LastName = "";author.PhoneNumber = "1234567890";author.Email = "joydipkanjilal@yahoo.com";

接下来在 Main 方法中去验证这些属性值是否符合验证规则。

ValidationContext context = new ValidationContext(author, null, null);List<ValidationResult> validationResults = new List<ValidationResult>();bool valid = Validator.TryValidateObject(author, context, validationResults, true);if (!valid){foreach (ValidationResult validationResult in validationResults){Console.WriteLine("{0}", validationResult.ErrorMessage);}}

从上面代码可以看出,context 就是 验证规则的上下文,然后调用 Validator.TryValidateObject 去做规则验证,如果有属性不符合 数据注解 的规则,错误信息都会如实的记录到 List<ValidationResult> 集合中。

下面是完整的可供参考的代码。

class Program{static void Main(string[] args){Author author = new Author();author.FirstName = "Joydip";author.LastName = "";author.PhoneNumber = "1234567890";author.Email = "joydipkanjilal@yahoo.com";ValidationContext context = new ValidationContext(author, null, null);List<ValidationResult> validationResults = new List<ValidationResult>();bool valid = Validator.TryValidateObject(author, context, validationResults, true);if (!valid){foreach (ValidationResult validationResult in validationResults){Console.WriteLine("{0}", validationResult.ErrorMessage);}}Console.ReadLine();}}public class Author{[Required(ErrorMessage = "{0} is required")][StringLength(50, MinimumLength = 3,ErrorMessage = "First Name should be minimum 3 characters and a maximum of 50 characters")][DataType(DataType.Text)]public string FirstName { get; set; }[Required(ErrorMessage = "{0} is required")][StringLength(50, MinimumLength = 3,ErrorMessage = "Last Name should be minimum 3 characters and a maximum of 50 characters")][DataType(DataType.Text)]public string LastName { get; set; }[DataType(DataType.PhoneNumber)][Phone]public string PhoneNumber { get; set; }[DataType(DataType.EmailAddress)][EmailAddress]public string Email { get; set; }}

接下来把程序跑起来,你会在 Console 中看到如下错误信息。

创建 自定义验证规则

前面都是使用系统内置的,如果你有 自定义验证规则 的需求,那就要重写 ValidationAttribute 类中的 IsValid 方法,如下代码所示:


[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class IsEmptyAttribute : ValidationAttribute{public override bool IsValid(object value){var inputValue = value as string;return !string.IsNullOrEmpty(inputValue);}}

然后将这个自定义的 IsEmptyAttribute 标记在 Author 类的 FirstName 和 LastName 属性上,如下代码所示:


[IsEmpty(ErrorMessage = "Should not be null or empty.")]
public string FirstName { get; set; }[IsEmpty(ErrorMessage = "Should not be null or empty.")]
public string LastName { get; set; }

数据注解 最初是在 .NET 3.5 中作为 System.ComponentModel.DataAnnotations 的一部分被引入的,从那时起,它就越来越流行了,你可以直接在属性上加 数据注解 避免在项目各处中都有对 Author 实体类的验证逻辑,这种也太麻烦了,不是吗?

后面的文章中,我会带大家一起学习如何在 ASP.NET Core MVC 中使用 数据注解 去做 model 的验证。

译文链接:https://www.infoworld.com/article/3543302/how-to-use-data-annotations-in-csharp.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql判断是否在日期区间_通过sql判断时间区间是否存在数据

在做项目的时候遇到过一个问题&#xff0c;用户需要获取当前月或者几个月的数据&#xff0c;但是有一个要求&#xff0c;如果已经存在一张单已经包含了这几个月的数据&#xff0c;那么就不能再提取到重复的数据。其实这个问题&#xff0c;我做完了我的方式之后才发现&#xff0…

2020年中国.NET开发者大会第二天 WorkShop

工作坊1&#xff1a;使用 NCF 从 0 到 1 快速模块化开发/部署业务系统实战工作坊简介&#xff1a;本次工作坊由盛派开发团队亲自带领开发者使用 NCF&#xff08;NeuCharFramework&#xff09; 框架进行系统快速开发&#xff0c;进行现场实操训练&#xff0c;大家可以通过本次活…

mysql直接生成excel_MYSQL 将excel里面的数据直接生成sql语句

如何使用EXCEL生成SQL语句&#xff1f;将光标放到新的列上里面&#xff0c;然后在公式栏里面输入如下公式&#xff1a;"insert into t values("&A1&","&B1&","&C1&","&D1&")"效果图&#x…

OrchardCore实现模块化核心原理分析

【导读】ABP vNext并未过多探究&#xff0c;当然其基于DDD理念分层清晰&#xff0c;灵活性、扩展性自然也不在话下&#xff0c;但有些情况下我可能会首选OrchardCore&#xff0c;并非ABP vNext不可若改造项目&#xff0c;也因历史遗留问题&#xff0c;数据库表设计也可能存在不…

sqoop将hive导出到mysql_Sqoop hive导出到mysql[转]

通过Sqoop将Hive表数据导入到MySQL通常有两种情况。第一种是将hive上某张表的全部数据导入到mysql对应的表中。第二种是将hive上某张表中的部分数据导入到mysql对应的表中。两种方式的区别在于第二种情况需要指定要导入数据的列名称。两种情况的导入方式分别如下&#xff1a;1.…

.NET 云原生架构师训练营(模块二 基础巩固 配置)--学习笔记

2.2.3 核心模块--配置IConfigurationOptionsASP.NET Core 中的配置&#xff1a;https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?viewaspnetcore-5.0IConfigurationIConfiguration 的使用层级对象配置到 key-value 键值对转换通过环境变量修改日志…

java分桃子_猴子分桃子.java

问题描述&#xff1a;猴子分桃&#xff1a;海 滩上有一堆桃子&#xff0c;五只猴子来分。第一只猴子把这堆桃子凭据分为五份&#xff0c;多了一个&#xff0c;这只猴子把多的一个扔入海中&#xff0c;拿走了一份。第二只猴子把剩下的桃子又平均分成五份&#xff0c;又多了一个&…

.NET Conf 2020 - 基于ASP.NET Core构建可热插拔的插件化系统

文章标题&#xff1a;.NET Conf 2020 - 基于ASP.NET Core构建可热插拔的插件化系统作者&#xff1a;Lamond Lu项目地址&#xff1a;https://github.com/lamondlu/CoolCat博客&#xff1a;http://www.cnblogs.com/lwqlun以下是2020.12.19日的演讲文稿和视频&#xff1a;大家好&a…

java获取机器号_(转)JAVA获得机器码的实现

http://yangshangchuan.iteye.com/blog/2012401首先&#xff0c;定义了一个统一的接口&#xff0c;以支持不同操作系统不同实现的透明切换&#xff1a;Java代码 收藏代码/***生成机器码的接口&#xff0c;不同平台有不同实现* author 杨尚川*/public interface SequenceServic…

多款主流编程语言,哪款开发软件最安全?

喜欢就关注我们吧&#xff01;在当下的市场环境中&#xff0c;除了掌握困扰软件的最常见安全问题外&#xff0c;开发人员还应该了解到底是什么问题在影响他们正在使用的编程语言。静态代码分析安全公司 Veracode 最近发布了一份年度软件安全状态&#xff08;SOSS&#xff09;报…

Java pdf文件传输_java中pdf文件的管理(pdf文件转png文件,base64传输文件以及删除)...

org.apache.pdfboxpdfbox2.0.12影像文件转为base64编码使用java自带的BASE64Encoder类代码部分&#xff1a;前端上传文件的保存&#xff1a;RequestMapping("upLoadImgs")ResponseBodypublic String upLoadAgreementsImg(HttpServletResponse response, HttpServletR…

【对比学习】koa.js、Gin与asp.net core——中间件

web框架中间件对比编程语言都有所不同&#xff0c;各个语言解决同一类问题而设计的框架&#xff0c;确有共通之处&#xff0c;毕竟是解决同一类问题&#xff0c;面临的挑战大致相同&#xff0c;比如身份验证&#xff0c;api授权等等&#xff0c;鄙人对node.js&#xff0c;golan…

java 传送解析8583报文_java发送ISO8583报文接口案例

【实例简介】java发送ISO8583报文实现平安银行支付接口【实例截图】【核心代码】pingAnBank└── pingAnBank├── build.xml├── client│ ├── ClientBean.java│ ├── UDPClient.java│ └── UdpClientSocket.java├── com│ └── solab│ └── i…

2020年终回顾:时间会回答成长,成长会回答梦想

前言2020年是脚踏实地&#xff0c;慢慢成长的一年&#xff0c;由于疫情的缘故&#xff0c;今年社区没有像去年一样举办多场线下活动&#xff0c;不过 .NET CONF CHINA 大会昨天也在苏州顺利召开&#xff0c;回顾这一年&#xff0c;也有不少惊喜与感悟2020年回顾公众号自从去年双…

java servlet 跳转_Servlet跳转方式sendReDirect()和forward()

在web应用服务中&#xff0c;经常会面对不同SERVLET之间的跳转&#xff0c;目前我们可以通过以下两种方式实现&#xff1a;1.RequestDispatcher.forward()2.ServletResponse.sendReDirect()两者的区别&#xff1a;1.redirect 方式可以跨应用访问,forward 只能在同一个应用中跳转…

明天面腾讯,我刷了这71道面试题...

激动人心的Conf 2020中国.NET开发者大会完美落幕&#xff0c;有幸去到现场&#xff0c;跟诸位.NET大佬、微软大咖、MVP面对面交流&#xff0c;内心很是鸡冻&#xff01;聊天中我注意到一个细节&#xff0c;很多公司的项目都在逐步用MySQL替换SQLServer&#xff0c;尤其是微服务…

java 毕向东 内部类_java基础内部类(毕向东老师)

内部类//特点&#xff1a;内部类可以直接访问外部类的成员&#xff0c;//外部类要访问内部类中的成员必须创建内部类的对象。//为什么要定义内部类呢&#xff1f;类是用于描述事物的&#xff0c;而事务中如果还有具体的事物&#xff0c;而且这个内部的事物在访问着所属事物中的…

java字符串切分_Java字符串分割(转)

java.lang.String的split()方法, JDK 1.4 or laterpublic String[] split(String regex,int limit)示例代码public class StringSplit {public static void main(String[] args) {String sourceStr "1,2,3,4,5";String[] sourceStrArray sourceStr.split(",&q…

面试官:. NET5源码里用到了哪些设计模式?懵!

作为微软最早迈向开源的重要软件之一&#xff0c;.NET 5的发布具有重要意义&#xff01;微软希望 .NET Framework 开发者能够迁移他们的代码和应用到 .NET 5.0 上&#xff0c;为明年发布的 .NET 6.0 将 Xamarin 开发者过渡到统一平台奠定基础。版本发布时间轴&#xff1a;.NET …

ldap java 密码_用java进行LDAP用户登陆(用户认证)及修改密码

一、用户认证public String execute(){Hashtable env new Hashtable();String LDAP_URL "ldap://8.8.8.8:389"; // LDAP访问地址env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");env.put(Context.PROVIDER_URL, LDAP_URL)…