asp.net mvc會自動根據屬性的類型進行基本的校驗,比如如果屬性是int類型,那么再提交非整數類型的數據的時候就會報錯
注意:asp.net mvc並不是再請求驗證失敗的時候拋出異常,而是把決定權交給程序員,程序員需要決定如何處理數據校驗失敗。再Action中根據ModelState.IsValid判斷是否驗證通過。
public ActionResult Index(Models.Person model) { //ModelState.IsValid:數據驗證 if (ModelState.IsValid) { string result = "age=" + model.age; return Content(result); } else { string result = "非法數值"; return Content(result); } }
雖然時候ModelState.IsValid能判斷驗證是否通過,如果沒有通過,那么就會報錯,通過下面的類就可以獲取到錯誤信息了
public static class ValiHelper { public static string GetValidMsg(ModelStateDictionary modelState) { StringBuilder sb = new StringBuilder(); foreach (var propName in modelState.Keys) { //modelState[propName].Errors是屬性相關的錯誤消息 if (modelState[propName].Errors.Count<=0) { continue; } sb.Append("屬性錯誤:").Append(propName).Append(":"); //遍歷每個錯誤消息(因為一個屬性可能有多個錯誤消息) foreach (ModelError modelError in modelState[propName].Errors) { sb.Append(modelError.ErrorMessage); } sb.AppendLine(); } return sb.ToString(); } }
方法調用
=============================================================================================================
數據驗證Attribute
Attribute主要是定義在屬性上面,類似於屬性里面的get,set方法。
常用的Attribute驗證
[Required] 代表必填項
[StringLength(100)] 代表字符串最大長度100
[StringLength(100,MinimumLength=10)] 代表長度介於10到100之間
[RegularExpression(@"aa(\d)+bb")] 代表正則表達式
[Range(10,20)] 代表數值的取值范圍,對比於字符串長度
[Compare("Email")] 代表這個屬性必須和Email屬性值一致
[EmailAddress] 代表郵箱地址
[phone] 表示電話號碼,規則有限制(不推薦使用)
如果在驗證Attribute上使用ErrorMessage="自定義錯誤信息"屬性,用來自定義報錯信息。其中ErrorMessage中可以用{0}占位符作為屬性名的占位。
public class ValiModel { [Required(ErrorMessage = "數據必須填寫")] public int id { get; set; } [StringLength(10, MinimumLength = 5)] [Required] public string name { get; set; } public int age { get; set; } }
========================================================
自定義驗證
方式一:
public class QQNumber:RegularExpressionAttribute { public QQNumber():base(@"^\d{5,10}$") { this.ErrorMessage = "字段{0}不是合法的qq號"; } }
方式二:
public class CNPhoneNumAttribute:ValidationAttribute { public CNPhoneNumAttribute() { this.ErrorMessage = "電話號碼必須是固話或者手機13,15,17開頭"; } public override bool IsValid(object value) { if (value is string) { string s = (string)value; if (s.Length==13) { if (s.StartsWith("13") || s.StartsWith("15") || s.StartsWith("17")) { return true; } else { this.ErrorMessage = ""; return false; } } else if (s.Contains("-")) //固定電話 { string[] strs = s.Split('-'); if (strs[0].Length==3||strs[0].Length==4) { return true; } else { return false; } } } return false; } }