對於web開發人員來說,對使用者輸入的資訊進行驗證是一個重要但是繁瑣的工作,而且很多開發人員都會忽略。asp.net mvc3架構使用的是叫做“資料註解”( DataAnnotations)的方式進行資料驗證。 這種方式允許程式在用戶端和伺服器端進行雙步驟驗證(asp.net的資料驗證控制項也是雙步驟驗證的)。雙步驟驗證的好處是 用戶端驗證會直接相應使用者,不用提交表單,也就減輕了伺服器的壓力還提高了使用者體驗;而伺服器端驗證是確保資料的有效性和完整性,因為有時候用戶端會關閉指令碼功能。 注意:要實現用戶端驗證,需要引用jquery以及jquery驗證檔案:
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script><script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script><script src="@Url.Conten("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 要實現伺服器端驗證,需要在提交表單後執行ModelState.IsValid 一、基礎驗證 1、Require(非空驗證) Model:
[Required] [Display(Name = "使用者名稱")] public string UserName { get; set; } 驗證結果:
2、StringLength(字串長度驗證) 可以驗證model屬性的最大長度和最小長度,分別對應 MaximumLength和 MinimumLength,其中MinimumLength是可選的。 Model:
[Required] [StringLength(100, MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "密碼")] public string Password { get; set; } 驗證結果
3、RegularExpression(Regex) 驗證符合該Regex的屬性。 Model:
[Required] [DataType(DataType.EmailAddress)] [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9._]+\.[A-Za-z]{2,4}")] [Display(Name = "電子郵件地址")] public string Email { get; set; } 驗證結果:
4、Range(數值範圍驗證) 用來指定數值的最大值和最小值,第一個參數是最小值,第二個參數是最大值(包含他們本身)。可以使用者int類型以及Double類型。 Model:
[Required] [Range(13, 18)] [Display(Name="年齡")] public int Age { get; set; } 驗證結果:
二、附加驗證 附加驗證是System.Web.Mvc中額外添加的兩個驗證特性,所以使用時必須添加using System.Web.Mvc 1、Remote(遠程驗證) 雖然asp.net mvc3提供了很多在model中直接驗證資料的特性,但是很多邏輯複雜的驗證沒辦法在model中來驗證,所以mvc3架構提供了這個遠程驗證特性,他允許開發人員在Controller中用C#代碼來驗證資料的有效性。 一個很經典的應用時驗證使用者名稱是否重複。這個資料驗證沒辦法在用戶端驗證,除非將所有的使用者名稱都發往用戶端(顯然這是不可能的)。所以Remote特性只進行伺服器端驗證。但是它是通過非同步方式進行驗證,所以有更好的使用者體驗。 Model:
[Required] [Display(Name = "使用者名稱")] [Remote("CheckUserName","Account")] public string UserName { get; set; } Controller:
public JsonResult CheckUserName(string userName) { var result = userName == "admin"; return Json(result, JsonRequestBehavior.AllowGet); } 驗證結果: 注意:如果要Post提交,則需要加上HttpMethod=“POST”:
[Required(ErrorMessageResourceType=typeof(ErrorMessage),ErrorMessageResourceName="UserRequire")] [Display(Name = "使用者名稱")] [Remote("CheckUserName","Account", HttpMethod="POST")] public string UserName { get; set; }
而Controller中也可以直接接受Post的請求,當然你加上[Httppost]也是可以的:
//[HttpPost] public JsonResult CheckUserName(string userName) { var result = userName != "admin"; return Json(result, JsonRequestBehavior.AllowGet); } 2、Compare(相同驗證) Compare特性是用來驗證輸入的兩個資料是否完全相同。最典型的例子就是註冊時兩次輸入的密碼是否相同。 Model:
[Required] [StringLength(100, ErrorMessage = "{0} 必須至少包含 {2} 個字元。", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "密碼")] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "確認密碼")] [Compare("Password", ErrorMessage = "密碼和確認密碼不匹配。")] public string ConfirmPassword { get; set; } 驗證結果:
上面的是asp.net mvc3架構的幾種常用的資料註解,除了後兩種mvc特有的特性,其他的特性都在System.ComponentModel.DataAnnotations中,恰當的使用會大大提高開發效率。具體的參見: http://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations.aspx