天天看點

【ASP.NET MVC系列】淺談資料注解和驗證

ASP.NET MVC系列文章

【01】淺談Google Chrome浏覽器(理論篇)

【02】淺談Google Chrome浏覽器(操作篇)(上)

【03】淺談Google Chrome浏覽器(操作篇)(下)

【04】淺談ASP.NET架構   

【05】淺談ASP.NET MVC運作過程    

【06】淺談ASP.NET MVC 控制器   

【07】淺談ASP.NET MVC 路由   

【08】淺談ASP.NET MVC 視圖 

【09】淺談ASP.NET MVC 視圖與控制器傳遞資料

【10】淺談jqGrid 在ASP.NET MVC中增删改查     

【11】淺談ASP.NET 頁面之間傳值的幾種方式

【12】淺談緩存技術在ASP.NET中的運用       

【13】淺談NuGet在VS中的運用      

【14】淺談ASP.NET 程式釋出過程           

【15】淺談資料注解和驗證           

【16】淺談依賴注入

【17】淺談表單和HTML輔助方法

【18】淺談基于APS.NET身份驗證

【19】淺談ASP.NET MVC 模型

【20】淺談ASP.NET MVC 單元測試

【21】淺談ASP.NET MVC網絡安全;

【22】淺談ASP.NET MVC八大類擴充

【23】再談ASP.NET MVC Routing

【24】淺談ASP.NET 進階話題

【25】淺談大型ASP.NET MVC項目(含DEMO)

【26】下一系列:ASP.NET WebAPI

【ASP.NET MVC系列】淺談資料注解和驗證

 一  概述

關于資料驗證和資料注解,是任何軟體系統不可小觑的必要子產品,在軟體系統中起到舉足輕重的作用。

1.從資料驗證的驗證方式來說,我們一般分為用戶端驗證和服務端驗證(或者兩種方式相結合);

2.從資料驗證的作用角度來說,資料驗證起到很重要的作用,如防止漏洞注入,防止網絡攻擊(XSS等),確定資料安全,確定資料合理性,防止垃圾資料等作用;

3.從資料驗證的種類來書,一般分為第三方驗證(如我們用Jquery寫好驗證插件,在用戶端用AJAX驗證)和基于ASP.NET MVC架構的資料驗證;

4.從資料注解的作用角度來說,如界面關鍵字段的友好設定和提示等;

說了那麼多,那麼本篇文章會講解哪些内容呢?

本篇文章主要講解基于ASP.NET MVC架構的資料驗證特性和資料注解。

【ASP.NET MVC系列】淺談資料注解和驗證

二  資料驗證

(一)ASP.NET MVC 内置六大類資料驗證特性

【ASP.NET MVC系列】淺談資料注解和驗證

1.在ASP.NET MVC中,驗證特性定義在System.ComponentModel.DataAnnotations命名空間中,是以我們在使用驗證特性前,需要引入命名空間:

using System.ComponentModel.DataAnnotations;      

2.ASP.NET MVC内置了六大驗證特性:Required,StringLength,RegularExpression,Range,Compare和Remote;

3.資料驗證使用單個驗證特性:指資料驗證隻使用其中一個驗證特性

1 [Required]
2  public string Username { get; set; }      

4.有些屬性,單個驗證特性無法滿足,需要兩個及其以上驗證特性組合,如密碼,至少要滿足兩個條件:

(1)必填      (2)不少于6位

[Required]
[StringLength(6)]
 public string Password { get; set; }      

5.用代碼示範一下五大驗證特性(Remote除外)

【ASP.NET MVC系列】淺談資料注解和驗證

Models:UserInfo.cs

【ASP.NET MVC系列】淺談資料注解和驗證
【ASP.NET MVC系列】淺談資料注解和驗證
1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 
 6 using System.ComponentModel.DataAnnotations;
 7 
 8 
 9 namespace DataValidate.Models
10 {
11     public class UserInfo
12     {
13         //定義使用者名必填
14         [Required]
15         public string UserName { get; set; }
16         //定義密碼必填,且滿足6位
17         [Required]
18         [StringLength(128,MinimumLength =6)]
19         public string Password { get; set; }
20         //驗證兩次輸入的密碼是否一緻
21         [Required]
22         [Compare("Password", ErrorMessage = "兩次密碼輸入不一緻")]
23         public string ConfirmPassword { get; set; }
24         //定義郵件為必填,且滿足郵件格式
25         [Required]
26         [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}")]
27         public string Email { get; set; }
28         //定義年齡為必填,且1-130歲之間
29         [Required]
30         [Range(1, 130)]
31         public int Age { get; set; }
32     }
33 }
34         
35        

View Code

 Controller:DefaultController

【ASP.NET MVC系列】淺談資料注解和驗證
【ASP.NET MVC系列】淺談資料注解和驗證
1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 using DataValidate.Models;
 8 namespace DataValidate.Controllers
 9 {
10     public class DefaultController : Controller
11     {
12         // GET: Default
13 
14         public ActionResult Index()
15         {
16             return View();
17         }
18 
19         public ActionResult DataValidateDemo(UserInfo userInfo)
20         {
21             UserInfo _userInfo = new UserInfo();
22             _userInfo.UserName = userInfo.UserName;
23             return View("Index");
24         }
25     }
26 }      

View:Index.cshtml

【ASP.NET MVC系列】淺談資料注解和驗證
【ASP.NET MVC系列】淺談資料注解和驗證
1 @model DataValidate.Models.UserInfo
 2 
 3 
 4 @{
 5     ViewBag.Title = "Index";
 6 }
 7 
 8 <h2>Index</h2>
 9 
10 @using (Html.BeginForm("DataValidateDemo", "Default"))
11 {
12     <div>@Html.Label("使用者名"): @Html.TextBoxFor(m=>m.UserName)
13     @Html.ValidationMessageFor(m=>m.UserName)
14     </div>
15     <div>@Html.Label("密碼"):@Html.TextBox("Password")
16     @Html.ValidationMessageFor(m=>m.Password)</div>
17 
18     <div>@Html.Label("确認密碼"):@Html.TextBox("ConfirmPassword")
19     @Html.ValidationMessageFor(m=>m.ConfirmPassword)</div>
20     <div>
21         @Html.Label("郵件"):@Html.TextBox("Email")
22         @Html.ValidationMessageFor(m => m.Email)
23     </div>
24     <div>
25         @Html.Label("年齡"):@Html.TextBox("Age")
26         @Html.ValidationMessageFor(m => m.Age)
27     </div>
28     <div><input type="submit" value="送出" /></div>
29 }      

我們來看看測試結果

【ASP.NET MVC系列】淺談資料注解和驗證

6.為什麼要把Remote剔出來單獨講解呢?

 我們知道,除Remote以外的五大驗證特性,命名空間均為System.ComponentModel.DataAnnotations,而Remote特性的命名空間卻是System.Web.Mvc。

 Remote,從字面意思可以看出,“遠端”,即遠端驗證。Remote特性指利用伺服器端的回調函數執行用戶端的驗證邏輯(當執行到有Remote特性的中繼資料時,會自動地調用相應的控制器下的Action)。

 舉個例子:新會員注冊時,一般手機号是不允許重複的,檢查DB中是否已存在手機号,可以使用Remote特性來驗證。

【ASP.NET MVC系列】淺談資料注解和驗證

Model:UserInfo.cs

【ASP.NET MVC系列】淺談資料注解和驗證
【ASP.NET MVC系列】淺談資料注解和驗證
1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 
 6 using System.ComponentModel.DataAnnotations;
 7 
 8 
 9 namespace DataValidate.Models
10 {
11     public class UserInfo
12     {
13         //定義使用者名必填
14         [Required]
15         public string UserName { get; set; }
16         //定義密碼必填,且滿足6位
17         [Required]
18         [StringLength(128,MinimumLength =6)]
19         public string Password { get; set; }
20         //驗證兩次輸入的密碼是否一緻
21         [Required]
22         [Compare("Password", ErrorMessage = "兩次密碼輸入不一緻")]
23         public string ConfirmPassword { get; set; }
24         //定義郵件為必填,且滿足郵件格式
25         [Required]
26         [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}")]
27         public string Email { get; set; }
28         //定義年齡為必填,且1-130歲之間
29         [Required]
30         [Range(1, 130)]
31          public int Age { get; set; }
32 
33         [Required]
34         [System.Web.Mvc.Remote("CheckTelephone", "Default", ErrorMessage ="手機号碼已經存在")]
35         public string Telephone { get; set; }
36     }
37 }
38         
39        

DefaultController

【ASP.NET MVC系列】淺談資料注解和驗證
【ASP.NET MVC系列】淺談資料注解和驗證
1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 using DataValidate.Models;
 8 namespace DataValidate.Controllers
 9 {
10     public class DefaultController : Controller
11     {
12         // GET: Default
13 
14         public ActionResult Index()
15         {
16             return View();
17         }
18 
19         public ActionResult DataValidateDemo(UserInfo userInfo)
20         {
21             UserInfo _userInfo = new UserInfo();
22             _userInfo.UserName = userInfo.UserName;
23             return View("Index");
24         }
25 
26         public ActionResult CheckTelephone(string telephone)
27         {
28             if (telephone=="13636595489")
29             {
30                 return Json("手機号"+telephone+ "已經存在", JsonRequestBehavior.AllowGet);
31             }
32             return Json(true, JsonRequestBehavior.AllowGet);
33 
34         }
35     }
36 }      

Index.cshtml

【ASP.NET MVC系列】淺談資料注解和驗證
【ASP.NET MVC系列】淺談資料注解和驗證
1 @model DataValidate.Models.UserInfo
 2 
 3 
 4 @{
 5     ViewBag.Title = "Index";
 6     Html.EnableClientValidation();
 7     Html.EnableUnobtrusiveJavaScript();
 8 
 9 }
10 
11 
12 <h2>Index</h2>
13 
14 @using (Html.BeginForm("DataValidateDemo", "Default"))
15 {
16     <div>
17         @Html.Label("使用者名"): @Html.TextBoxFor(m => m.UserName)
18         @Html.ValidationMessageFor(m => m.UserName)
19     </div>
20     <div>
21         @Html.Label("密碼"):@Html.TextBox("Password")
22         @Html.ValidationMessageFor(m => m.Password)
23     </div>
24 
25     <div>
26         @Html.Label("确認密碼"):@Html.TextBox("ConfirmPassword")
27         @Html.ValidationMessageFor(m => m.ConfirmPassword)
28     </div>
29     <div>
30         @Html.Label("郵件"):@Html.TextBox("Email")
31         @Html.ValidationMessageFor(m => m.Email)
32     </div>
33     <div>
34         @Html.Label("年齡"):@Html.TextBox("Age")
35         @Html.ValidationMessageFor(m => m.Age)
36     </div>
37     <div>
38         @Html.Label("手機号碼"):@Html.TextBox("Telephone")
39         @Html.ValidationMessageFor(m => m.Telephone)
40     </div>
41     <div><input type="submit" value="送出" /></div>
42 }
43 @section scripts{
44 
45     <script src="~/Scripts/jquery.validate.js"></script>
46     <script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
47 }      

測試結果:

【ASP.NET MVC系列】淺談資料注解和驗證
【ASP.NET MVC系列】淺談資料注解和驗證

 給大家留一個思考題:如何驗證多個參數?

      在實際項目開發中,一般我們驗證的不僅僅是一個參數,而是多個參數,如使用者名和手機号,身份證号等一起驗證,關于多參數驗證,Remote驗證特性又是怎麼處理的呢?

 (二) 驗證錯誤提示

【ASP.NET MVC系列】淺談資料注解和驗證

1.什麼是驗證錯誤提示?

指驗證字段在驗證不通過時,回報給使用者的提示資訊,如密碼不能低于6位,手機号必須為11位,年齡限制在1-130歲之間等,通過驗證特性的ErroMessage實作。

[Required]
[StringLength(128,MinimumLength =6,ErrorMessage ="密碼不能低于6位數")]      

2.錯誤驗證提示大緻分為兩大類:預設錯誤提示和自定義錯誤提示。

 (1)預設錯誤提示:當我們不指定ErroMessage的值時,ASP.NET MVC架構會指定預設值。

//定義密碼必填,且滿足6位
[Required]
[StringLength(128,MinimumLength =6)]
 public string Password { get; set; }      

Result:

【ASP.NET MVC系列】淺談資料注解和驗證

(2)自定義值:我們為ErrorMessage指定具體自定義的值“密碼不能低于6位數”

[Required]
[StringLength(128,MinimumLength =6,ErrorMessage ="密碼不能低于6位數")]
 public string Password { get; set; }      

 Result:

【ASP.NET MVC系列】淺談資料注解和驗證

3.為什麼要有自定義錯誤提示?

(1)為使用者呈現友好提示,我們來看一下2中的預設值和自定義值;

預設值:字段Password必須是一個字元串,其最小長度為6,最大長度為128(這麼一句話,要是給不懂程式的使用者看了,肯定會瘋掉,

很簡單,對程式員來說,“字段”二字再基礎不過,可對使用者來說,他可能會問,字段是什麼東東?)

自定義值:密碼不能低于6位數(無論是程式員還是使用者,都能看得明白)

 (2)提高通用性,比如對美國提供英語提示,對俄羅斯提供俄語提示等;

4.如何實作通用性國際化?

在如上的自定義驗證錯誤提示中,我們使用的是寫死的形式,然而,面向國際市場開發的,這種寫死錯誤消息提示是不實用的,因為我們要為不同地區顯示

不同内容,實作國際化,慶幸的是,所有驗證特性都允許為本地化的錯誤消息提示指定資源類型名稱和資源名稱,感興趣的讀者朋友,請參照How to:Set the

Cultrue and UI Cultrue for ASP.NET Page Globalization(sites:http://msdn.microsoft.com/en-us/library/bz9tc508.aspx)

【ASP.NET MVC系列】淺談資料注解和驗證

 思考題,如何實作錯誤消息通用性國際化?

 (三)  驗證原理

關于資料驗證,我們思考這樣一個問題:驗證是什麼時候發生的?如何才能知道驗證失敗?

本節我們将來回答這個問題。

【ASP.NET MVC系列】淺談資料注解和驗證

 1.要想充分了解驗證原理,我們應該先熟悉幾個基本概念:模型綁定器,模型中繼資料,模型驗證器和模型狀态(這部分内容,本篇文章不論述,大家知道這幾個概念即可,具體詳情内容,

将在接下來的文章中與大家分享:【ASP.NET MVC系列】淺談ASP.NET MVC 模型)

 2.預設情況下,ASP.NET MVC架構在模型綁定時就執行驗證邏輯,在執行驗證時,分為隐式執行和顯示執行。

 (1)隐式執行:一般指在控制器的Action中帶有參數時,就會隐式執行模型驗證。如下方法帶有參數,是以就隐式執行模型綁定。

1 public ActionResult DataValidateDemo(UserInfo userInfo)
2         {
3             UserInfo _userInfo = new UserInfo();
4             _userInfo.UserName = userInfo.UserName;
5             return View("Index");
6         }      

 (2)顯示執行:隻利用控制器的UpdateModel或TryUpdateModel方式時,顯示執行模型綁定。

3.模型綁定器一旦使用新值更新模型屬性時,就會利用目前的模型中繼資料獲得模型的所有驗證器;

4.ASP.NET MVC運作時,DataAnnotationsModelValidator與資料驗證一起工作;

5.DataAnnotationsModelValidator驗證器會找到所有的驗證特性并執行它所包含的驗證邏輯;

6.模型綁定器捕獲所有失敗的驗證規則,并把他們放入模型狀态中;

7.模型綁定主要的副産品是模型狀态,模型狀态包含如下内容:

   (1)包含使用者放入模型屬性中的所有值;

   (2)包含每個屬性相關聯的所有錯誤;

  (3)包含所有與模型對象本身有關的錯誤;

8.如果模型狀态中存在錯誤,ModelState.IsValid就傳回false;

9.控制操作和驗證錯誤是怎樣執行的?

【ASP.NET MVC系列】淺談資料注解和驗證

控制器操作決定模型驗證失敗和驗證成功時的執行流程。

   (1)驗證成功時:當驗證成時,操作通常會執行必要的步驟來儲存或更新使用者資訊;

   (2)驗證失敗時:當驗證失敗時,操作一般會重新渲染送出模型值得視圖;

(四)自定義驗證

ASP.NET MVC之是以強大,在于其提供強大的自定義和擴充性,關于這個内容,會在後續的文章:“【SP.NET MVC系列】淺談ASP.NET MVC八大類擴充”中深入講解這兩個強大的特性。

【ASP.NET MVC系列】淺談資料注解和驗證

 1.基于ASP.NET MVC的自定義驗證,一般分為兩大類型:将驗證邏輯封裝在自定義資料中和将驗證邏輯封裝在模型對象中。

  (1)将驗證邏輯封裝在自定義資料中:複雜,但可複用性高;

  (2)将驗證邏輯封裝在模型對象中:簡單,但可複用性低;

 2.将驗證邏輯封裝在自定資料中(會在後續的文章:“【ASP.NET MVC系列】淺談ASP.NET MVC八大類擴充”中深入講解)

 3.将驗證邏輯封裝模型對象中(會在後續的文章:“【ASP.NET MVC系列】淺談ASP.NET MVC八大類擴充”中深入講解)

三 資料注解

 (一)七大類型ASP.NET MVC内置資料注解

【ASP.NET MVC系列】淺談資料注解和驗證

1.Dispaly特性:(1)模型屬性設定友好的顯示名稱  (2)控制UI上屬性的顯示順序;

2.ScaffoldColumn特性:隐藏HTML輔助方法;

3.DisplayFormat特性:處理屬性的各種格式化選項;

4.ReadOnly特性:確定預設的模型綁定器不使用新值來更新;

5.DataType特性:提供關于屬性的特定資訊;

6.UIHint特性:(1)為ASP.NET MVC運作時提供模闆名稱,以備調用模闆輔助方法渲染輸出時使用  (2)自定義模闆輔助方法;

7.HiddenInput特性:渲染type為hidden的元素;

四   參考文獻

【01】ASP.NET MVC5 進階程式設計(Jon Galloway,Brad Wilson,K.Scott Allen,David Matson 著 ,孫遠帥 譯)

【02】ASP.NET MVC5程式設計實戰(第3版)(Dino Esposite 著,潘麗丞 譯)

五   版權區

  • 感謝您的閱讀,若有不足之處,歡迎指教,共同學習、共同進步。
  • 部落客網址:http://www.cnblogs.com/wangjiming/。
  • 極少部分文章利用讀書、參考、引用、抄襲、複制和粘貼等多種方式整合而成的,大部分為原創。
  • 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:[email protected]
  • 可以轉載該部落格,但必須著名部落格來源。

繼續閱讀