head命令和tail命令
如何在 C# 中使用 資料註解
資料註解 是一種可以應用到 類 或者 類成員上用來指定類之間關係的一種 Attribute,它的應用場景比較多,可用來描述 UI 上如何進行資料展示,還可以用來做類屬性的規則驗證,這篇文章就來討論為什麼 註解 值得你去學習,以及如何在 .NET Core 中使用。
使用 System.ComponentModel.DataAnnotations
要想執行本篇的例子,需要將System.ComponentModel.DataAnnotations
引用到專案中。
值得注意的是,Attribute 常用來給 class 或者 property 標註元資料資訊,很顯然註解 Atrribute
- 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 實體類的驗證邏輯,這種也太麻煩了,不是嗎?