1. 程式人生 > 其它 >head命令和tail命令

head命令和tail命令

如何在 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 實體類的驗證邏輯,這種也太麻煩了,不是嗎?