【ASP.NET MVC系列】淺談數據註解和驗證

ASP.NET MVC系列文章html

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

【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


 一  概述

關於數據驗證和數據註解,是任何軟件系統不可小覷的必要模塊,在軟件系統中起到舉足輕重的做用。

1.從數據驗證的驗證方式來講,咱們通常分爲客戶端驗證和服務端驗證(或者兩種方式相結合);

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

3.從數據驗證的種類來書,通常分爲第三方驗證(如咱們用Jquery寫好驗證插件,在客戶端用AJAX驗證)和基於ASP.NET MVC框架的數據驗證;

4.從數據註解的做用角度來講,如界面關鍵字段的友好設置和提示等;

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

本篇文章主要講解基於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除外)

 

Models:UserInfo.cs

 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

 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 Code

View:Index.cshtml

 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 }
View Code

咱們來看看測試結果

6.爲何要把Remote剔出來單獨講解呢?

 咱們知道,除Remote之外的五大驗證特性,命名空間均爲System.ComponentModel.DataAnnotations,而Remote特性的命名空間倒是System.Web.Mvc。

 Remote,從字面意思能夠看出,「遠程」,即遠程驗證。Remote特性指利用服務器端的回調函數執行客戶端的驗證邏輯(當執行到有Remote特性的元數據時,會自動地調用相應的控制器下的Action)。

 舉個例子:新會員註冊時,通常手機號是不容許重複的,檢查DB中是否已存在手機號,可使用Remote特性來驗證。

Model:UserInfo.cs

 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  
View Code

DefaultController

 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 }
View Code

Index.cshtml

 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 }
View Code

測試結果:

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

      在實際項目開發中,通常咱們驗證的不只僅是一個參數,而是多個參數,如用戶名和手機號,身份證號等一塊兒驗證,關於多參數驗證,Remote驗證特性又是怎麼處理的呢?

 (二) 驗證錯誤提示

 

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:

(2)自定義值:咱們爲ErrorMessage指定具體自定義的值「密碼不能低於6位數」

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

 Result:

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)

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

 (三)  驗證原理

關於數據驗證,咱們思考這樣一個問題:驗證是何時發生的?如何才能知道驗證失敗?

本節咱們未來回答這個問題。

 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.控制操做和驗證錯誤是怎樣執行的?

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

   (1)驗證成功時:當驗證成時,操做一般會執行必要的步驟來保存或更新用戶信息;

   (2)驗證失敗時:當驗證失敗時,操做通常會從新渲染提交模型值得視圖;

(四)自定義驗證

ASP.NET MVC之因此強大,在於其提供強大的自定義和擴展性,關於這個內容,會在後續的文章:「【SP.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內置數據註解

 

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/。
  • 極少部分文章利用讀書、參考、引用、抄襲、複製和粘貼等多種方式整合而成的,大部分爲原創。
  • 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:2098469527@qq.com。
  • 能夠轉載該博客,但必須著名博客來源。
相關文章
相關標籤/搜索