国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

ASP.NET MVC下的四種驗證編程方式

開發 后端
ASP.NET MVC采用Model綁定為目標Action生成了相應的參數列表,但是在真正執行目標Action方法之前,還需要對綁定的參數實施驗證以確保其有效性,我們將針對參數的驗證成為Model綁定。總地來說,我們可以采用4種不同的編程模式來進行針對綁定參數的驗證。

ASP.NET MVC采用Model綁定為目標Action生成了相應的參數列表,但是在真正執行目標Action方法之前,還需要對綁定的參數實施驗證以確保其有效性,我們將針對參數的驗證成為Model綁定。總地來說,我們可以采用4種不同的編程模式來進行針對綁定參數的驗證。

一、手工驗證綁定的參數

在定義具體Action方法的時候,對已經成功綁定的參數實施手工驗證無疑是一種最為直接的編程方式,接下來我們通過一個簡單的實例來演示如何將參數驗證邏輯實現在對應的Action方法中,并在沒有通過驗證的情況下將錯誤信息響應給客戶端。我們在一個ASP.NET MVC應用中定義了如下一個Person類作為被驗證的數據類型,它的Name、Gender和Age三個屬性分別表示一個人的姓名、性別和年齡。

  1. public class Person  
  2. {  
  3.     [DisplayName("姓名")]  
  4.     public string Name { getset; }  
  5.  
  6.     [DisplayName("性別")]  
  7.     public string Gender { getset; }  
  8.  
  9.     [DisplayName("年齡")]  
  10.     public int? Age { getset; }  

接下來我們定義了如下一個HomeController。在針對GET請求的Action方法Index中,我們創建了一個Person對象并將其作為Model呈現在對應的View中。另一個支持POST請求的Index方法具有一個Person類型的參數,我們在該Action方法中先調用Validate方法對這個輸入參數實施驗證。如果驗證成功(ModeState.IsValid屬性返回True),我們返回一個內容為“輸入數據通過驗證”的ContentResult,否則將此參數作為Model呈現在對應的View中。

  1. public class HomeController : Controller  
  2. {  
  3.     [HttpGet]  
  4.     public ActionResult Index()  
  5.     {  
  6.         return View(new Person());  
  7.     }  
  8.  
  9.     [HttpPost]  
  10.     public ActionResult Index(Person person)  
  11.     {  
  12.         Validate(person);  
  13.  
  14.         if (!ModelState.IsValid)  
  15.         {  
  16.             return View(person);  
  17.         }  
  18.         else 
  19.         {  
  20.             return Content("輸入數據通過驗證");  
  21.         }  
  22.     }  
  23.  
  24.     private void Validate(Person person)  
  25.     {  
  26.         if (string.IsNullOrEmpty(person.Name))  
  27.         {  
  28.             ModelState.AddModelError("Name""'Name'是必需字段");  
  29.         }  
  30.  
  31.         if (string.IsNullOrEmpty(person.Gender))  
  32.         {  
  33.             ModelState.AddModelError("Gender""'Gender'是必需字段");  
  34.         }  
  35.         else if (!new string[] { "M""F" }.Any(  
  36.             g => string.Compare(person.Gender, g, true) == 0))  
  37.         {  
  38.             ModelState.AddModelError("Gender",   
  39.             "有效'Gender'必須是'M','F'之一");  
  40.         }  
  41.  
  42.         if (null == person.Age)  
  43.         {  
  44.             ModelState.AddModelError("Age""'Age'是必需字段");  
  45.         }  
  46.         else if (person.Age > 25 || person.Age < 18)  
  47.         {  
  48.             ModelState.AddModelError("Age""有效'Age'必須在18到25周歲之間");  
  49.         }  
  50.     }  

如上面的代碼片斷所示,我們在Validate該方法中我們對作為參數的Person對象的3個屬性進行逐條驗證,如果提供的數據沒有通過驗證,我們會調用當前ModelState的AddModelError方法將指定的驗證錯誤消息轉換為ModelError保存起來。我們采用的具體的驗證規則如下。

  • Person對象的Name、Gender和Age屬性均為必需字段,不能為Null(或者空字符串)。
  • 表示性別的Gender屬性的值必需是“M”(Male)或者“F”(Female),其余的均為無效值。
  • Age屬性表示的年齡必須在18到25周歲之間。

如下所示的是Action方法Index對應View的定義,這是一個Model類型為Person的強類型View,它包含一個用于編輯人員信息的表單。我們直接調用HtmlHelper<TModel> 的擴展方法EditorForModel將作為Model的Person對象以編輯模式呈現在表單之中。

  1. @model Person  
  2. <html> 
  3. <head> 
  4.     <title>編輯人員信息</title> 
  5. </head> 
  6. <body> 
  7.     @using (Html.BeginForm())  
  8.     {   
  9.         @Html.EditorForModel()  
  10.         <input type="submit" value="保存"/> 
  11.     }  
  12. </body> 
  13. </html> 

直接運行該程序后,一個用于編輯人員基本信息的頁面會被呈現出來,如果我們在輸入不合法的數據并提交后,相應的驗證信息會以圖1所示的形式呈現出來。

二、使用ValidationAttribute特性

將針對輸入參數的驗證邏輯和業務邏輯定義在Action方法中并不是一種值得推薦的編程方式。在大部分情況下,同一個數據類型在不同的應用場景中具有相同的驗證規則,如果我們能將驗證規則與數據類型關聯在一起,讓框架本身來實施數據驗證,那么最終的開發者就可以將關注點更多地放在業務邏輯的實現上面。實際上這也是ASP.NET MVC的Model驗證系統默認支持的編程方式。當我們在定義數據類型的時候,可以在類型及其數據成員上面應用相應的ValidationAttribute特性來定義默認采用的驗證規則。

“System.ComponentModel.DataAnnotations”命名空間定義了一系列具體的ValidationAttribute特性類型,它們大都可以直接應用在自定義數據類型的某個屬性上對目標數據成員實施驗證。這些預定義驗證特性不是本章論述的重點,我們會在“下篇”中對它們作一個概括性的介紹。

常規驗證可以通過上面列出的這些預定義ValidationAttribute特性來完成,但是在很多情況下我們需要通過創建自定義的ValidationAttribute特性來解決一些特殊的驗證。比如上面演示實例中針對Person對象的驗證中,我們要求Gender屬性指定的表示性別的值必須是“M/m”和“F/f”兩者之一,這樣的驗證就不得不通過自定義的ValidationAttribute特性來實現。

針對 “某個值必須在指定的范圍內”這樣的驗證規則,我們定義一個DomainAttribute特性。如下面的代碼片斷所示,DomainAttribute具有一個IEnumerable<string>類型的只讀屬性Values提供了一個有效值列表,該列表在構造函數中被初始化。具體的驗證實現在重寫的IsValid方法中,如果被驗證的值在這個列表中,則視為驗證成功并返回True。為了提供一個友好的錯誤消息,我們重寫了方法FormatErrorMessage。

  1. [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field,   AllowMultiple = false)]  
  2. public class DomainAttribute : ValidationAttribute  
  3. {  
  4.     public IEnumerable<string> Values { getprivate set; }  
  5.  
  6.     public DomainAttribute(string value)  
  7.     {  
  8.         this.Values = new string[] { value };  
  9.     }  
  10.  
  11.     public DomainAttribute(params string[] values)  
  12.     {  
  13.         this.Values = values;  
  14.     }  
  15.  
  16.     public override bool IsValid(object value)  
  17.     {  
  18.         if (null == value)  
  19.         {  
  20.             return true;  
  21.         }  
  22.         return this.Values.Any(item => value.ToString() == item);  
  23.     }  
  24.  
  25.     public override string FormatErrorMessage(string name)  
  26.     {  
  27.         string[] values = this.Values.Select(value => string.Format("'{0}'",  value)).ToArray();  
  28.         return string.Format(base.ErrorMessageString, name,string.Join(",",   values));  
  29.     }  

由于ASP.NET MVC在進行參數綁定的時候會自動提取應用在目標參數類型或者數據成員上的ValidationAttribute特性,并利用它們對提供的數據實施驗證,所以我們不再需要像上面演示的實例一樣自行在Action方法中實施驗證,而只需要在定義參數類型Person的時候應用相應的ValidationAttribute特性將采用的驗證規則與對應的數據成員相關聯。

如下所示的是屬性成員上應用了相關ValidationAttribute特性的Person類型的定義。我們在三個屬性上均應用了RequiredAttribute特性將它們定義成必需的數據成員,Gender和Age屬性上則分別應用了DomainAttribute和RangeAttribute特性對有效屬性值的范圍作了相應限制。

  1. public class Person  
  2. {  
  3.     [DisplayName("姓名")]  
  4.     [Required(ErrorMessageResourceName = "Required",    ErrorMessageResourceType = typeof(Resources))]  
  5.     public string Name { getset; }  
  6.  
  7.     [DisplayName("性別")]  
  8.     [Required(ErrorMessageResourceName = "Required",   ErrorMessageResourceType = typeof(Resources))]  
  9.     [Domain("M""F""m""f", ErrorMessageResourceName = "Domain",  ErrorMessageResourceType = typeof(Resources))]  
  10.     public string Gender { getset; }  
  11.  
  12.     [DisplayName("年齡")]  
  13.     [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources))]  
  14.     [Range(18, 25, ErrorMessageResourceName = "Range",  ErrorMessageResourceType = typeof(Resources))]  
  15.     public int? Age { getset; }  

三個ValidationAttribute特性采用的錯誤消息均定義在項目默認的資源文件中(我們可以采用這樣的步驟創建這個資源文件:右鍵選擇Solution Exploror中的項目,并在上下文菜單中選擇“屬性”選項打開“項目屬性”對象框。最后在對話框中選擇“資源”Tab頁面,通過點擊頁面中的鏈接創建一個資源文件),具體定義如圖2所示。

由于ASP.NET MVC會自動提取應用在綁定參數類型上的ValidationAttribute特性對綁定的參數實施自動化驗證,所以我們根本不需要在具體的Action方法中來對參數作手工驗證。如下面的代碼片斷所示,我們在Action方法Index中不再顯式調用Validate方法,但是運行該程序并在輸入不合法數據的情況下提交表單后依然會得到如圖1所示的輸出結果。

  1. public class HomeController : Controller  
  2. {  
  3.     //其他成員  
  4.     [HttpPost]  
  5.     public ActionResult Index(Person person)  
  6.     {  
  7.         if (!ModelState.IsValid)  
  8.         {  
  9.             return View(person);  
  10.         }  
  11.         else 
  12.         {  
  13.             return Content("輸入數據通過驗證");  
  14.         }  
  15.     }  

#p#

三、讓數據類型實現IValidatableObject接口

除了將驗證規則通過ValidationAttribute特性直接定義在數據類型上并讓ASP.NET MVC在進行參數綁定過程中據此來驗證參數之外,我們還可以將驗證操作直接定義在數據類型中。既然我們將驗證操作直接實現在了數據類型上,意味著對應的數據對象具有“自我驗證”的能力,我們姑且將這些數據類型稱為“自我驗證類型”。這些自我驗證類型是實現了具有如下定義的接口IValidatableObject,該接口定義在“System.ComponentModel.DataAnnotations”命名空間下。

  1. public interface IValidatableObject  
  2. {  
  3.     IEnumerable<ValidationResult> Validate(  ValidationContext validationContext);  

如上面的代碼片斷所示,IValidatableObject接口具有唯一的方法Validate,針對自身的驗證就實現在該方法中。對于上面演示實例中定義的數據類型Person,我們可以按照如下的形式將它定義成自我驗證類型。

  1. public class Person: IValidatableObject  
  2. {  
  3.     [DisplayName("姓名")]  
  4.     public string Name { getset; }  
  5.  
  6.     [DisplayName("性別")]  
  7.     public string Gender { getset; }  
  8.  
  9.     [DisplayName("年齡")]  
  10.     public int? Age { getset; }  
  11.  
  12.     public IEnumerable<ValidationResult> Validate( ValidationContext validationContext)  
  13.     {  
  14.         Person person = validationContext.ObjectInstance as Person;  
  15.         if (null == person)  
  16.         {  
  17.             yield break;  
  18.         }  
  19.         if(string.IsNullOrEmpty(person.Name))  
  20.         {  
  21.             yield return new ValidationResult("'Name'是必需字段"new string[]{"Name"});  
  22.         }  
  23.  
  24.         if (string.IsNullOrEmpty(person.Gender))  
  25.         {  
  26.             yield return new ValidationResult("'Gender'是必需字段"new string[] { "Gender" });  
  27.         }  
  28.         else if (!new string[]{"M","F"}.Any( g=>string.Compare(person.Gender,g, true) == 0))  
  29.         {  
  30.             yield return new ValidationResult("有效'Gender'必須是'M','F'之一",   new string[] { "Gender" });  
  31.         }  
  32.  
  33.         if (null == person.Age)  
  34.         {  
  35.             yield return new ValidationResult("'Age'是必需字段",    new string[] { "Age" });  
  36.         }  
  37.         else if (person.Age > 25 || person.Age < 18)  
  38.         {  
  39.             yield return new ValidationResult("'Age'必須在18到25周歲之間",    new string[] { "Age" });  
  40.         }              
  41.     }  

如上面的代碼片斷所示,我們讓Person類型實現了IValidatableObject接口。在實現的Validate方法中,我們從驗證上下文中獲取被驗證的Person對象,并對其屬性成員進行逐個驗證。如果數據成員沒有通過驗證,我們通過一個ValidationResult對象封裝錯誤消息和數據成員名稱(屬性名),該方法最終返回的是一個元素類型為ValidationResult的集合。在不對其他代碼作任何改動的情況下,我們直接運行該程序并在輸入不合法數據的情況下提交表單后依然會得到如圖1所示的輸出結果。

四、讓數據類型實現IDataErrorInfo接口

上面我們讓數據類型實現IValidatableObject接口并將具體的驗證邏輯定義在實現的Validate方法中,這樣的類型能夠被ASP.NET MVC所識別,后者會自動調用該方法對綁定的數據對象實施驗證。如果我們讓數據類型實現IDataErrorInfo接口也能實現類似的自動化驗證效果。

IDataErrorInfo接口定義在“System.ComponentModel”命名空間下,它提供了一種標準的錯誤信息定制方式。如下面的代碼片段所示,IDataErrorInfo具有兩個成員,只讀屬性Error用于獲取基于自身的錯誤消息,而只讀索引用于返回指定數據成員的錯誤消息。

  1. public interface IDataErrorInfo  
  2. {  
  3.     string Error { get; }  
  4.     string this[string columnName] { get; }  

同樣是針對上面演示的實例,現在我們對需要被驗證的數據類型Person進行了重新定義。如下面的代碼片斷所示,我們讓Person實現了IDataErrorInfo接口。在實現的索引中,我們將索引參數columnName視為屬性名稱,根據它按照上面的規則對相應的屬性成員實施驗證,并在驗證失敗的情況下返回相應的錯誤消息。在不對其他代碼作任何改動的情況下,我們直接運行該程序并在輸入不合法數據的情況下提交表單后依然會得到如圖1所示的輸出結果。

  1. public class Person : IDataErrorInfo  
  2. {  
  3.     [DisplayName("姓名")]  
  4.     public string Name { getset; }  
  5.  
  6.     [DisplayName("性別")]  
  7.     public string Gender { getset; }  
  8.  
  9.     [DisplayName("年齡")]  
  10.     public int? Age { getset; }  
  11.  
  12.     [ScaffoldColumn(false)]  
  13.     public string Error { getprivate set; }  
  14.  
  15.     public string this[string columnName]  
  16.     {  
  17.         get   
  18.         {  
  19.             switch (columnName)  
  20.             {  
  21.                 case "Name":  
  22.                     {   
  23.                         if(string.IsNullOrEmpty(this.Name))  
  24.                         {  
  25.                             return "'姓名'是必需字段";  
  26.                         }  
  27.                         return null;  
  28.                     }  
  29.                 case "Gender":  
  30.                     {  
  31.                         if (string.IsNullOrEmpty(this.Gender))  
  32.                         {  
  33.                             return "'性別'是必需字段";  
  34.                         }  
  35.                         else if (!new string[] { "M""F" }.Any(  
  36.                             g => string.Compare(this.Gender, g, true) == 0))  
  37.                         {  
  38.                             return "'性別'必須是'M','F'之一";  
  39.                         }  
  40.                         return null;  
  41.                     }  
  42.                 case "Age":  
  43.                     {  
  44.                         if (null == this.Age)  
  45.                         {  
  46.                             return "'年齡'是必需字段";  
  47.                         }  
  48.                         else if (this.Age > 25 || this.Age < 18)  
  49.                         {  
  50.                             return "'年齡'必須在18到25周歲之間";  
  51.                         }  
  52.                         return null;  
  53.                     }  
  54.                 defaultreturn null;  
  55.                           
  56.             }  
  57.         }  
  58.     }  

原文鏈接:http://www.cnblogs.com/artech/p/asp-net-mvc-validation-programming.html

責任編輯:林師授 來源: 博客園
相關推薦

2009-04-27 10:33:16

ASP.NET視圖狀態

2009-03-31 13:12:05

ASP.NETMVC表單驗證

2025-03-26 07:53:24

2009-09-18 10:20:26

PRG數據驗證

2011-04-12 13:53:25

ASP.NET MVCjQuery

2011-05-23 10:37:03

2009-07-31 12:43:59

ASP.NET MVC

2009-07-24 13:20:44

MVC框架ASP.NET

2009-11-24 15:11:21

ASP.NET MVC

2009-07-29 09:59:10

ASP.NET For

2009-07-22 18:07:55

論壇應用程序ASP.NET MVC

2009-07-20 15:44:32

ASP.NET MVC

2009-07-22 09:11:02

Action方法ASP.NET MVC

2009-07-22 10:34:37

ActionInvokASP.NET MVC

2009-07-20 10:53:59

ASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2009-07-23 16:59:31

ASP.NET認證Form表單
點贊
收藏

51CTO技術棧公眾號

亚洲另类图片色| 中文字幕亚洲无线码a| 国产男女激情视频| 亚洲精品韩国| 在线观看视频欧美| 男女羞羞网站| 日本一区二区三区视频| 欧美性大战久久久久久久蜜臀| jizz在亚洲| 久久久久久一级片| 丁香六月激情婷婷| 午夜亚洲一区| 中文字幕亚洲图片| 欧美高清你懂的| 日韩中文字幕在线| 四虎视频在线精品免费网址| 欧美一级黄色片| 毛片免费不卡| 国产精品嫩草影院久久久| 中文日韩欧美| 精品国产乱码久久久久久久软件| 一区二区三区福利| 色一情一乱一伦一区二区三区| 国产区精品区| 亚洲福利av| 久久久久久久精| 成人3d动漫网站| 亚洲精品久久7777| 最近最好的中文字幕2019免费 | 精品亚洲精品| 97国产精品免费视频| 国产精一品亚洲二区在线视频| 麻豆av免费在线| 午夜电影网亚洲视频| 成人做爰视频www网站小优视频| 一区二区三区在线播放欧美| freemovies性欧美| 久久九九热免费视频| 亚洲网色网站| 一区视频二区视频| 亚洲欧美日韩在线播放| 黄色av电影在线观看| 欧美精品一区二区视频| 亚洲免费在线视频| 345成人影院| 777精品视频| 99re国产精品| 中文字幕日韩一区二区三区| 欧美欧美欧美欧美| 亚洲人成亚洲精品| 成人动漫在线观看视频 | 黄网站色视频免费观看| 日韩亚洲欧美成人| 九九九久久久精品| 午夜激情在线| 国产不卡av在线免费观看| 国产综合色产在线精品| 天天干天天操天天做| 亚洲色在线视频| 国产在线观看91一区二区三区 | 大波视频国产精品久久| 99久久精品99国产精品| 成人精品国产亚洲| 亚洲欧美在线网| 日韩一区二区免费电影| 亚洲毛片播放| 在线视频2区| 亚洲sss综合天堂久久| 亚洲一区影音先锋| 精品国产乱子伦一区二区| 欧美日韩电影一区二区| 亚洲欧美激情视频| 99精品热视频| 久久91导航| 久久国产亚洲精品无码| 欧美白人最猛性xxxxx69交| 久久久夜精品| 欧美亚洲韩国| 日韩极品视频在线观看| 精品一区电影国产| 欧美wwww| 97超碰青青草| 久久人91精品久久久久久不卡 | 国产精品美女视频网站| 大伊人狠狠躁夜夜躁av一区| 97se亚洲综合| 国产欧美精品一区二区三区| 国产精品视频麻豆| 成人av免费在线| 日本韩国精品一区二区在线观看| 日韩在线高清视频| 国产伦精品一区二区三区四区免费 | 国产精品久久电影观看| 国产日韩av一区二区| www.成人在线| 久久国内精品视频| 极品美女销魂一区二区三区| 亚洲精品在线影院| 激情婷婷丁香| 国产精品欧美久久久| 精品一区国产| 成人免费在线一区二区三区| 日韩一区二区精品葵司在线| 亚洲视频在线一区二区| 欧美激情中文不卡| 伊人久久婷婷| 蜜桃视频www网站在线观看| 松下纱荣子在线观看| a级片在线免费观看| 98精品视频| 久久精品在这里| 久久艳片www.17c.com| 久久婷婷开心| 丝袜国产免费观看| youjizzxxxx18| 色视频www在线播放| 成年人黄色电影| 国产情侣av自拍| 欧美色图色综合| 99久久久精品视频| 国产经典一区二区| 亚洲欧洲日产国产网站| 亚洲瘦老头同性70tv| 天堂资源中文在线| av久久久久久| 免费网站www在线观看| 97香蕉久久| 人狥杂交一区欧美二区| 牛牛在线精品视频| 免费在线看黄| 国产jizz| 国产xxxxx| 老司机在线免费视频| 国产黄色影视| 欧美草逼视频| 在线看的av网站| 日本高清网站| 日日噜噜夜夜狠狠视频| 国产三级三级三级看三级| www.亚洲天堂网| 天堂中文字幕一二区| 亚洲不卡视频在线| 日本成在线观看| av资源网在线观看| 色一区二区三区| 亚洲电影影音先锋| 狠狠色伊人亚洲综合成人| 亚洲国产一区二区精品专区| 亚洲麻豆视频| 久久婷婷成人综合色| 五月婷婷激情综合网| 日韩一区二区久久久| 国产视频精品va久久久久久| 91精品国产91热久久久做人人| 欧美性生交xxxxxdddd| 亚洲第一页在线| 国产极品精品在线观看| 九九九热999| 青草成人免费视频| 91精品国产自产在线老师啪| 国产伦精品一区二区三区视频黑人| 久久精品magnetxturnbtih| 老太脱裤子让老头玩xxxxx| 日本中文视频| 国产黄色免费在线观看| 国产精品毛片无码| 欧美三级不卡| 麻豆91精品| 一二三区精品视频| 精品欧美乱码久久久久久1区2区 | 欧美一级片免费看| 精品久久久香蕉免费精品视频| 欧美日韩激情| 日韩在线播放一区二区| 精品国产一区二区三区性色av| 水蜜桃久久夜色精品一区| 一区二区在线视频观看| 午夜影院欧美| 岛国精品在线| 最近高清中文在线字幕在线观看1| 国产精品ⅴa有声小说| 国产日韩精品推荐| 欧美老女人性视频| 亚洲欧美激情在线视频| 国产精品高潮呻吟久久av无限| 精品调教chinesegay| 欧美在线小视频| 成人亚洲综合色就1024| 亚洲国产精品中文| 国产精品一区二区三区免费观看| 国产高清在线一区| 日本aⅴ免费视频一区二区三区| 美国一区二区| 99国产精品自拍| 国产传媒日韩欧美成人| 亚洲综合在线观看视频| 日韩国产精品亚洲а∨天堂免| 久久99精品视频一区97| caoporn成人| 国产精品国产自产拍在线|