• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

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

    來源:懂視網 責編:小采 時間:2020-11-27 22:38:10
    文檔

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

    ASP.NET MVC的四種驗證編程方式:我們可以采用4種不同的編程模式來進行針對綁定參數的驗證。 一、手工驗證綁定的參數 在定義具體Action方法的時候,對已經成功綁定的參數實施手工驗證無疑是一種最為直接的編程方式,接下來我們通過一個簡單的實例來演示如何將參數驗證邏輯實現在對應的Act
    推薦度:
    導讀ASP.NET MVC的四種驗證編程方式:我們可以采用4種不同的編程模式來進行針對綁定參數的驗證。 一、手工驗證綁定的參數 在定義具體Action方法的時候,對已經成功綁定的參數實施手工驗證無疑是一種最為直接的編程方式,接下來我們通過一個簡單的實例來演示如何將參數驗證邏輯實現在對應的Act

    我們可以采用4種不同的編程模式來進行針對綁定參數的驗證。

    一、手工驗證綁定的參數

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

    public class Person 
    { 
     [DisplayName("姓名")] 
     public string Name { get; set; } 
     
     [DisplayName("性別")] 
     public string Gender { get; set; } 
     
     [DisplayName("年齡")] 
     public int? Age { get; set; } 
    } 
    

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

    public class HomeController : Controller 
    { 
     [HttpGet] 
     public ActionResult Index() 
     { 
     return View(new Person()); 
     } 
     
     [HttpPost] 
     public ActionResult Index(Person person) 
     { 
     Validate(person); 
     
     if (!ModelState.IsValid) 
     { 
     return View(person); 
     } 
     else 
     { 
     return Content("輸入數據通過驗證"); 
     } 
     } 
     
     private void Validate(Person person) 
     { 
     if (string.IsNullOrEmpty(person.Name)) 
     { 
     ModelState.AddModelError("Name", "'Name'是必需字段"); 
     } 
     
     if (string.IsNullOrEmpty(person.Gender)) 
     { 
     ModelState.AddModelError("Gender", "'Gender'是必需字段"); 
     } 
     else if (!new string[] { "M", "F" }.Any( 
     g => string.Compare(person.Gender, g, true) == 0)) 
     { 
     ModelState.AddModelError("Gender", 
     "有效'Gender'必須是'M','F'之一"); 
     } 
     
     if (null == person.Age) 
     { 
     ModelState.AddModelError("Age", "'Age'是必需字段"); 
     } 
     else if (person.Age > 25 || person.Age < 18) 
     { 
     ModelState.AddModelError("Age", "有效'Age'必須在18到25周歲之間"); 
     } 
     } 
    } 
    

    如上面的代碼片斷所示,我們在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對象以編輯模式呈現在表單之中。

    @model Person 
    <html> 
    <head> 
     <title>編輯人員信息</title> 
    </head> 
    <body> 
     @using (Html.BeginForm()) 
     { 
     @Html.EditorForModel() 
     <input type="submit" value="保存"/> 
     } 
    </body> 
    </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。

    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] 
    public class DomainAttribute : ValidationAttribute 
    { 
     public IEnumerable<string> Values { get; private set; } 
     
     public DomainAttribute(string value) 
     { 
     this.Values = new string[] { value }; 
     } 
     
     public DomainAttribute(params string[] values) 
     { 
     this.Values = values; 
     } 
     
     public override bool IsValid(object value) 
     { 
     if (null == value) 
     { 
     return true; 
     } 
     return this.Values.Any(item => value.ToString() == item); 
     } 
     
     public override string FormatErrorMessage(string name) 
     { 
     string[] values = this.Values.Select(value => string.Format("'{0}'", value)).ToArray(); 
     return string.Format(base.ErrorMessageString, name,string.Join(",", values)); 
     } 
    } 
    

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

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

    public class Person 
    { 
     [DisplayName("姓名")] 
     [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources))] 
     public string Name { get; set; } 
     
     [DisplayName("性別")] 
     [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources))] 
     [Domain("M", "F", "m", "f", ErrorMessageResourceName = "Domain", ErrorMessageResourceType = typeof(Resources))] 
     public string Gender { get; set; } 
     
     [DisplayName("年齡")] 
     [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources))] 
     [Range(18, 25, ErrorMessageResourceName = "Range", ErrorMessageResourceType = typeof(Resources))] 
     public int? Age { get; set; } 
    } 
    

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

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

    public class HomeController : Controller 
    { 
     //其他成員 
     [HttpPost] 
     public ActionResult Index(Person person) 
     { 
     if (!ModelState.IsValid) 
     { 
     return View(person); 
     } 
     else 
     { 
     return Content("輸入數據通過驗證"); 
     } 
     } 
    } 
    

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

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

    public interface IValidatableObject 
    { 
     IEnumerable<ValidationResult> Validate( ValidationContext validationContext); 
    } 
    

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

    public class Person: IValidatableObject 
    { 
     [DisplayName("姓名")] 
     public string Name { get; set; } 
     
     [DisplayName("性別")] 
     public string Gender { get; set; } 
     
     [DisplayName("年齡")] 
     public int? Age { get; set; } 
     
     public IEnumerable<ValidationResult> Validate( ValidationContext validationContext) 
     { 
     Person person = validationContext.ObjectInstance as Person; 
     if (null == person) 
     { 
     yield break; 
     } 
     if(string.IsNullOrEmpty(person.Name)) 
     { 
     yield return new ValidationResult("'Name'是必需字段", new string[]{"Name"}); 
     } 
     
     if (string.IsNullOrEmpty(person.Gender)) 
     { 
     yield return new ValidationResult("'Gender'是必需字段", new string[] { "Gender" }); 
     } 
     else if (!new string[]{"M","F"}.Any( g=>string.Compare(person.Gender,g, true) == 0)) 
     { 
     yield return new ValidationResult("有效'Gender'必須是'M','F'之一", new string[] { "Gender" }); 
     } 
     
     if (null == person.Age) 
     { 
     yield return new ValidationResult("'Age'是必需字段", new string[] { "Age" }); 
     } 
     else if (person.Age > 25 || person.Age < 18) 
     { 
     yield return new ValidationResult("'Age'必須在18到25周歲之間", new string[] { "Age" }); 
     } 
     } 
    } 
    

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

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

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

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

    public interface IDataErrorInfo 
    { 
     string Error { get; } 
     string this[string columnName] { get; } 
    } 
    

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

    public class Person : IDataErrorInfo 
    { 
     [DisplayName("姓名")] 
     public string Name { get; set; } 
     
     [DisplayName("性別")] 
     public string Gender { get; set; } 
     
     [DisplayName("年齡")] 
     public int? Age { get; set; } 
     
     [ScaffoldColumn(false)] 
     public string Error { get; private set; } 
     
     public string this[string columnName] 
     { 
     get 
     { 
     switch (columnName) 
     { 
     case "Name": 
     { 
     if(string.IsNullOrEmpty(this.Name)) 
     { 
     return "'姓名'是必需字段"; 
     } 
     return null; 
     } 
     case "Gender": 
     { 
     if (string.IsNullOrEmpty(this.Gender)) 
     { 
     return "'性別'是必需字段"; 
     } 
     else if (!new string[] { "M", "F" }.Any( 
     g => string.Compare(this.Gender, g, true) == 0)) 
     { 
     return "'性別'必須是'M','F'之一"; 
     } 
     return null; 
     } 
     case "Age": 
     { 
     if (null == this.Age) 
     { 
     return "'年齡'是必需字段"; 
     } 
     else if (this.Age > 25 || this.Age < 18) 
     { 
     return "'年齡'必須在18到25周歲之間"; 
     } 
     return null; 
     } 
     default: return null; 
     
     } 
     } 
     } 
    } 
    

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

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

    ASP.NET MVC的四種驗證編程方式:我們可以采用4種不同的編程模式來進行針對綁定參數的驗證。 一、手工驗證綁定的參數 在定義具體Action方法的時候,對已經成功綁定的參數實施手工驗證無疑是一種最為直接的編程方式,接下來我們通過一個簡單的實例來演示如何將參數驗證邏輯實現在對應的Act
    推薦度:
    標簽: 驗證 的驗證 net
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 正在播放酒店精品少妇约 | 国产亚洲精品精品国产亚洲综合| 一区二区国产精品| 99RE8这里有精品热视频| 久久狠狠高潮亚洲精品| 污污网站国产精品白丝袜| 中文字幕亚洲精品| 2022免费国产精品福利在线| 亚洲无码日韩精品第一页| 国产精品无码一区二区在线| 久久精品嫩草影院| 99国产精品永久免费视频| 少妇人妻无码精品视频app| 青娱乐国产精品视频| 国产精品粉嫩美女在线观看| 久久精品一区二区三区不卡| 精品久久8x国产免费观看| 亚洲精品乱码久久久久久久久久久久| 惠民福利中文字幕人妻无码乱精品 | 国产精品1024香蕉在线观看| 欧洲精品99毛片免费高清观看| 亚洲精品视频在线观看你懂的| 久久久久国产精品嫩草影院| 国产欧美日本亚洲精品一5| 99精品视频在线观看婷| 久久亚洲国产精品一区二区| 国产精品成人在线| 国产偷亚洲偷欧美偷精品| 国产精品久久波多野结衣| 亚洲国产精品自在拍在线播放| 97精品一区二区视频在线观看 | 精品国产乱码一区二区三区| 日韩一区精品视频一区二区| 亚洲欧美精品SUV| 中文精品无码中文字幕无码专区| 日本午夜精品理论片A级APP发布| 久久久久亚洲精品无码网址| 久久久久成人精品无码| 亚洲精品久久久www| 亚洲国产主播精品极品网红 | 精品人妻码一区二区三区|