對於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(正則表達式)
驗證符合該正則表達式的屬性。
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