在.NET MVC 中,當頁面提交model到Action的時候,自動填充ModelState。使用ModelState.IsValid進行方便快捷的數據驗證,其驗證也是調用命名空間
System.ComponentModel.DataAnnotations中的各種方法進行驗證。但是使用非MVC架構時,就需要寫很多
if判斷或者正則表達式,當有多個字段需要驗證的的時候不知道有多少人和我一樣很厭煩這種用
if判斷的方式。這里記錄一個方法,使用
System.ComponentModel.DataAnnotations來實現自己的驗證model拋出相應的錯誤信息。
C#文檔地址: System.ComponentModel.DataAnnotations
C#文檔地址: System.ComponentModel.DataAnnotations
這里我們先實現一個Person類,里面包含幾個簡單的屬性,然后指定幾個Attribute
public class Person { [Required(ErrorMessage = "{0} 必須填寫")] [DisplayName("姓名")] public string Name { get; set; } [Required(ErrorMessage = "{0} 必須填寫")] [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage = "郵件格式不正確")] public string Email { get; set; } [Required(ErrorMessage = "{0} 必須填寫")] [Range(1, 100, ErrorMessage = "超出范圍")] public int Age { get; set; } [Required(ErrorMessage = "{0} 必須填寫")] [StringLength(11, MinimumLength = 11, ErrorMessage = "{0}輸入長度不正確")] public string Phone { get; set; } [Required(ErrorMessage = "{0} 必須填寫")] [Range(typeof(decimal), "1000.00", "2000.99")] public decimal Salary { get; set; } }
然后實現一個ValidatetionHelper靜態類,這里主要用到的是Validator.TryValidateObject方法。
public static class ValidatetionHelper { public static ValidResult IsValid(object value) { ValidResult result = new ValidResult(); try { var validationContext = new ValidationContext(value, null, null); var results = new List<ValidationResult>(); var isValid = Validator.TryValidateObject(value, validationContext, results, true); if (!isValid) { result.IsVaild = false; result.ErrorMembers = new List<ErrorMember>(); foreach (var item in results) { result.ErrorMembers.Add(new ErrorMember() { ErrorMessage = item.ErrorMessage, ErrorMemberName = item.MemberNames.FirstOrDefault() }); } } else { result.IsVaild = true; } } catch (Exception ex) { result.IsVaild = false; result.ErrorMembers = new List<ErrorMember>(); result.ErrorMembers.Add(new ErrorMember() { ErrorMessage = ex.Message, ErrorMemberName = "Internal error" }); } return result; } }
其中需要的返回結果類
public class ValidResult { public List<ErrorMember> ErrorMembers { get; set; } public bool IsVaild { get; set; } } public class ErrorMember { public string ErrorMessage { get; set; } public string ErrorMemberName { get; set; } }
實現一個測試代碼,這里看到對應驗證數據比使用多個if簡潔很多,整個代碼也十分美觀。
static void Main(string[] args) { Person person = new Person(); person.Name = ""; person.Email = "121 212 K"; person.Phone = "2345"; person.Salary = 3000; var result = ValidatetionHelper.IsValid(person); if (!result.IsVaild) { foreach (ErrorMember errorMember in result.ErrorMembers) { Console.WriteLine(errorMember.ErrorMemberName + ":" + errorMember.ErrorMessage); } } Console.Read(); }
通過測試,可以看到得到正確的驗證結果。

后續有時間,把DisplayName給顯示上去,那就更完美了。
