在.NET MVC 中况木,當頁面提交model到Action的時候,自動填充ModelState。使用ModelState.IsValid進行方便快捷的數(shù)據(jù)驗證,其驗證也是調(diào)用命名空間System.ComponentModel.DataAnnotations中的各種方法進行驗證蟀伸。但是使用非MVC架構(gòu)時,就需要寫很多if判斷或者正則表達式缅刽,當有多個字段需要驗證的的時候不知道有多少人和我一樣很厭煩這種用if判斷的方式啊掏。這里記錄一個方法,使用System.ComponentModel.DataAnnotations來實現(xiàn)自己的驗證model拋出相應(yīng)的錯誤信息衰猛。
C#文檔地址:System.ComponentModel.DataAnnotations
這里我們先實現(xiàn)一個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; }
}
然后實現(xiàn)一個ValidatetionHelper靜態(tài)類,這里主要用到的是Validator.TryValidateObject方法腕侄。
public static ValidResult IsValid(object value)
{
ValidResult result= new ValidResult();
try
{
var validationContext = new ValidationContext(value);
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;
}
其中需要的返回結(jié)果類
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; }
}
實現(xiàn)一個測試代碼,這里看到對應(yīng)驗證數(shù)據(jù)比使用多個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();
}
通過測試微姊,可以看到得到正確的驗證結(jié)果。
測試結(jié)果
后續(xù)有時間分预,把DisplayName給顯示上去兢交,那就更完美了。