如何在 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 = "[email protected]";

接下來在 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 = "[email protected]";


            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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章