博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在 C# 中使用 数据注解
阅读量:4036 次
发布时间:2019-05-24

本文共 4928 字,大约阅读时间需要 16 分钟。

数据注解 是一种可以应用到 类 或者 类成员上用来指定类之间关系的一种 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
 validationResults = new List
();                        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
 validationResults = new List
();                        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://mgkdi.baihongyu.com/

你可能感兴趣的文章
Idea下安装Lombok插件
查看>>
zookeeper
查看>>
Idea导入的工程看不到src等代码
查看>>
技术栈
查看>>
Jenkins中shell-script执行报错sh: line 2: npm: command not found
查看>>
8.X版本的node打包时,gulp命令报错 require.extensions.hasownproperty
查看>>
Jenkins 启动命令
查看>>
Maven项目版本继承 – 我必须指定父版本?
查看>>
Maven跳过单元测试的两种方式
查看>>
通过C++反射实现C++与任意脚本(lua、js等)的交互(二)
查看>>
利用清华镜像站解决pip超时问题
查看>>
[leetcode BY python]1两数之和
查看>>
微信小程序开发全线记录
查看>>
Centos import torchvision 出现 No module named ‘_lzma‘
查看>>
PTA:一元多项式的加乘运算
查看>>
CCF 分蛋糕
查看>>
解决python2.7中UnicodeEncodeError
查看>>
小谈python 输出
查看>>
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
查看>>
python:如何将excel文件转化成CSV格式
查看>>