數據註解 是一種可以應用到 類 或者 類成員上用來指定類之間關係的一種 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