mvc html validator,ASP.NET MVC實現Validation驗證器擴展

今天介紹在ASP.NET MVC實現Validation驗證器擴展,通過使用Controller驗證并不是最好的方法:驗證過于分散,容易造成重復代碼,不利于維護與擴展,因此本節將使用MVC默認綁定器(DefaultModelBinder)中包含了驗證架構,并實現Validation驗證器擴展,請看下文:

MVC中可直接在控制器Action方法中進行驗證:檢查傳入參數,如果傳入參數不符合業務規則,則通過控制器的ModelState屬性的AddModelError方法向模型狀態添加錯誤消息,通過ModelState.IsValid判斷模型是否全部通過驗證,隨后,在視圖中通過Html.ValidationSummary、Html.ValidationMessage、Html.ValidationMessageFor輔助方法生成驗證消息。

驗證應該是和模型緊密相關的,如果我們將模型獨立為一個單獨的程序集,那么驗證也應該包含在模型的程序集中。從用戶錄入的數據到具體的模型,這個映射過程就是模型綁定,所以在綁定過程中實現驗證是一個不錯的選擇,這也是MVC中最重要的驗證方式。

MVC默認綁定器(DefaultModelBinder)中包含了驗證架構,具體來說,默認綁定器在將值提供器的數據填充到模型的時候,遵循以下流程:調用默認綁定器的OnModelUpdating方法—>從值提供器獲取值并填充到模型—>調用默認綁定器的OnModelUpdated方法。DefaultModelBinder類中OnModelUpdating方法始終返回true,即默認綁定器在填充模型之前沒有驗證,在填充數據后,OnModelUpdated中實現相應的驗證。默認綁定器中驗證體系類關系圖如下:

fb0a774681fd62e3cb953dc7be35af32.png

模型綁定中的驗證體系包含三個主要類:

驗證器提供者:ModelValidatorProvider,用于產生驗證器

驗證器:ModelValidator,用于實現具體的驗證邏輯,其中GetClientValidationRules用于返回客戶端驗證腳本使用的驗證規則(ModelClientValidationRule),Validate方法用于實現服務端的驗證邏輯。

特性:通常由提供者使用,根據特性指定的規則產生相應的驗證器

ModelValidatorProviders是一個靜態類,他包含一個用于保存MVC中默認驗證器提供者的集合(靜態屬性Proviers),MVC在填充完模型數據之后,依次對每一個模型屬性,從Providers中獲取所有的針對該屬性的驗證器,然后調用驗證器上的Validate方法產生驗證結果(ModelValidationResult),綁定器根據該結果數據向ModelState中添加驗證消息。

MVC中實現了三個默認的驗證器提供者(相應產生三個驗證器):

DataAnnotationsModelValidatorProvider: 用于實現.NET中的驗證特性,即System.ComponentModel.DataAnnotations命名空間下的多種驗證特性,包含用于限制屬性區間的RangeAttribute,用于驗證數據是否符合正則表達式的RegularExpressionAttribute,用于指定必需項的RequiredAttribute,用于限制字符串長度的StringLengthAttribute,DataAnnotationsModelValidatorProvider通過橋接模式,將.NET的驗證特性轉換為ModelValidator,所以我們可以直接在MVC中使用.NET驗證特性來實現驗證。

DataErrorInfoClassModelValidatorProvider: 此提供器主要是為了向后兼容,用于實現基于IDataErrorInfo接口的驗證方式(MVC 1.0),即你可以為模型實現IDataErrorInfo接口,這樣默認綁定器同樣可以通過該接口來調用你的驗證邏輯。

ClientDataTypeModelValidatorProvider: 此提供器只用于客戶端對數值型數據的驗證(產生相應的客戶端驗證腳本),他的Validate方法不會返回任何驗證結果。

MVC中另外實現了一個抽象類:AssociatedValidatorProvider,它從ModelValidatorProvider繼承,并重寫了GetValidator方法,增加傳入了附加在模型屬性上的特性集合。所以,如果我們需要實現基于特性的驗證方式,則應該從此類繼承實現自己的驗證器及相應的提供者類。當然我們也可以使用默認的DataAnnotationsModelValidatorProvider,這樣我們只需要從ValidationAttribute特性繼承,并實現自己的驗證邏輯。

客戶端驗證

ModelValidator中GetClientValidationRules方法可以返回用于客戶端的驗證規則,這些規則可以在客戶端腳本中訪問,客戶端腳本根據這些驗證規則檢查用戶錄入資料,并將驗證結果反饋給用戶。

下例將實現一個ConfirmValidator,用于驗證用戶注冊時兩次密碼必須輸入一致:

1、創建一個空MVC項目

2、添加用戶信息模型UserInfo.cs

顯示行號 復制代碼 ?UserInfo

public classUserInfo

{

public stringUserName { get; set; }

public stringPassword { get; set; }

public stringConfirmPassword { get; set; }

public stringEmail { get; set; }

}

3、創建一個特性,用于指定與屬性關聯的另一個屬性的名稱

顯示行號 復制代碼 ?ConfirmValidatorAttribute

public classConfirmValidatorAttribute: Attribute

{

publicStringConfirmPropertyName { get; set; }

publicConfirmValidatorAttribute(stringname)

{

ConfirmPropertyName = name;

}

}

4、創建用于實現驗證邏輯的ConfirmValidator類

顯示行號 復制代碼 ?ConfirmValidator

public classConfirmValidator: ModelValidator

{

private stringconfirmPropertyName;

publicConfirmValidator(ModelMetadatametaData, ControllerContextcontext, stringconfirmProperty)

: base(metaData, context)

{

confirmPropertyName = confirmProperty;

}

public overrideIEnumerable Validate(objectcontainer)

{

if(container == null)

yield break;

PropertyInfopi = container.GetType().GetProperty(confirmPropertyName);

if(pi != null)

{

stringconfirmValue = (string)pi.GetValue(container, null);

if( !(Metadata.Model??String.Empty).Equals(confirmValue??String.Empty))

{

yield return newModelValidationResult()

{

Message = "兩次輸入不一致!"

};

}

}

else

{

throw newInvalidOperationException("屬性"+ confirmPropertyName + "不存在");

}

}

}

5、創建用于產生ConfirmValidator的提供者類:ConfirmValidatorProvider

顯示行號 復制代碼 ?ConfirmValidatorProvider

public classConfirmValidatorProvider: AssociatedValidatorProvider

{

protected overrideIEnumerable GetValidators(ModelMetadatametadata, ControllerContextcontext, IEnumerable attributes)

{

foreach(ConfirmValidatorAttributeattr inattributes.OfType())

{

yield return newConfirmValidator(metadata, context, attr.ConfirmPropertyName);

}

}

}

6、創建用于測試的控制器及視圖

顯示行號 復制代碼 ?HomeController

public classHomeController: Controller

{

publicActionResultIndex()

{

returnView(newUserInfo());

}

[HttpPost]

publicActionResultIndex(UserInfoui)

{

returnView(ui);

}

}

x) %>

7、修改UserInfo.cs,在ConfirmPassword屬性上添加ConfirmValidator特性。

[ConfirmValidator("Password")]

public stringConfirmPassword { get; set; }

8、在Global Application_Start中添加ConfirmValidatorProvider

ModelValidatorProviders.Providers.Add(newConfirmValidatorProvider());

實現客戶端驗證:

1、修改ConfirmValidator類,添加GetClientValidationRules方法。

public overrideIEnumerable GetClientValidationRules()

{

ModelClientValidationRulerule = newModelClientValidationRule()

{

ErrorMessage = "兩次輸入不一致!",

ValidationType = "ConfirmValidator"

};

rule.ValidationParameters["ConfirmPropertyName"] = confirmPropertyName;

yield returnrule;

}

2、修改Index.aspx,添加對Ajax腳本的引用

3、添加自定義驗證腳本

Sys.Mvc.ValidatorRegistry.validators.ConfirmValidator = function (rule) {

var propertyName = rule.ValidationParameters.ConfirmPropertyName;

return function (value, context) {

var confirmValue =document.getElementsByName(propertyName)[0].value;

return (value == confirmValue);

}

};

4、開啟客戶端驗證功能

5、將ConfirmPassword屬性加入客戶端驗證

x.ConfirmPassword); %>

修改后完整視圖代碼:

x.ConfirmPassword); %>

x) %>

Sys.Mvc.ValidatorRegistry.validators.ConfirmValidator = function(rule) {

varpropertyName = rule.ValidationParameters.ConfirmPropertyName;

return function(value, context) {

varconfirmValue = document.getElementsByName(propertyName)[0].value;

return(value == confirmValue);

}

};

d331f804cf73bdde78a59c48cfaf0d66.png

驗證用于保證用戶輸入的正確性,及時阻止用戶提交錯誤數據,確保數據符合業務規則。為此實現自定義擴展的驗證,其實也是一件相當必要的事情。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272966.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272966.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272966.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git 幾種還原版本_Git恢復之前版本的兩種方法reset、revert(圖文詳解)

一、問題描述在利用github實現多人合作程序開發的過程中,我們有時會出現錯誤提交的情況,此時我們希望能撤銷提交操作,讓程序回到提交前的樣子,本文總結了兩種解決方法:回退(reset)、反做(revert)。二、背景知識git的版…

自定義列表視圖

通過繼承BaseAdapter寫一個子類,可以創建自定義列表視圖: public class MyListAdapter extends BaseAdapter { private LayoutInflater mInflater;//聲明一個LayoutInflater類變量 private Context mContext;//聲明一個Context類變量 priva…

計算機專業答辯模板,論文答辯模板-計算機專業.ppt

《論文答辯模板-計算機專業.ppt》由會員分享,可在線閱讀,更多相關《論文答辯模板-計算機專業.ppt(9頁珍藏版)》請在裝配圖網上搜索。1、基于S2SH論壇系統的設計與實現,專業: 姓名: 學號: 指導教師:,(附)論文…

springmvc請求返回一個字符_SpringMVC系列之Web利器SpringMVC

課程簡介:課程目標:了解SpringMVC和Spring的關系,能夠使用SpringMVC框架開發自己的Web應用。整合Spring , SpringMVC , MyBatis搭建項目開發環境,理解三層架構和MVC模式適用人群:適合對Java基礎知識應用自如&#xff0…

一次完整較為滲透過程

步驟一: 利用阿D瀏覽器通過https://s.bt.gg 注入關鍵字掃描發現注入點: http://www.rqyl.gov.cn/*****.php?ID153 用啊D跑不出賬號密碼 步驟二: 手工注入http://www.rqyl.gov.cn/*****.php?ID153 and 11 、and12出錯 猜字段ht…

html5 filereader讀取文件,H5的FileReader分布讀取文件應該如何使用以及其方法簡介...

這次給大家帶來H5的FileReader分布讀取文件應該如何使用以及其方法簡介,H5的FileReader分布讀取文件的使用以及其方法簡介的注意事項有哪些,下面就是實戰案例,一起來看一下。先介紹一下H5中FileReader的一些方法以及事件FileReader方法名稱 作…

mysql 查詢某一主鍵在那些表中中被設置為外鍵了

use information_schema; show tables; select * from KEY_COLUMN_USAGE where COLUMN_NAMEareaid; 轉載于:https://www.cnblogs.com/liaojie970/p/4799750.html

室內空氣流動原理圖_新風系統原理圖—新風系統原理介紹

如今我們在進行新家的裝修的時候,不少人為了家人的健康著想,都在選購家電的同時會選擇安裝一款新風系統。但是盡管如此,大家對新風系統原理其實并不了解,更不要提新風系統各部分的原理了,下面小編就結合新風系統原理圖…

計算機網絡線路爭用,計算機網絡系統集成復習要點

計算機網絡系統集成復習要點計算機網絡系統集成復習要點1.在信息領域,對于系統集成一般分為軟件集成、硬件集成和網絡系統集成。2.按網絡覆蓋范圍的大小,將計算機網絡分為局域網(LAN)、城域網(MAN)、廣域網(WAN)和互聯網。3. 計算機網絡拓撲結構是指一個…

mrsql查詢第二高的成績_mysql-查找用戶的最高分數和相關的詳細信息

我有一個表,用戶可以在其中存儲分數和有關該分數的其他信息(例如,分數注釋或花費的時間等).我想要一個mysql查詢,該查詢可找到每個用戶的個人最佳成績及其相關的注釋和時間等我嘗試使用的是這樣的:SELECT *,MAX(score)FROM table GROUP BY(用戶)這樣做的問題是,雖然…

centos 7 防火墻和端口配置

開啟redis端口,修改防火墻配置文件 vi /etc/sysconfig/iptables 加入端口配置 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 6379:7000 -j AC…

計算機網絡實驗11.6.1,6.111 2004春季課程:數位系統概論實驗(Introductory Digital Systems Laboratory, Spring 2004)...

摘要:Lectures and labs on digital logic, flipflops, PALs, counters, timing, synchronization, finite-state machines, and microprogrammed systems prepare students for the design and implementation of a final project of their choice: games, music, …

v380pro設備連接失敗_天貓精靈可以連接臺式電腦使用嗎?需要什么東西? 安裝操作是哪幾個步驟? 最好有圖片解說!...

使用語音將天貓精靈調到【藍牙配對】;打開電腦的藍牙適配界面,讓電腦找到天貓精靈,稍等片刻,點擊【使用遠程裝置的揚聲器聆聽來自此PC的音頻】后的連接;最后調整音量即可。以下是詳細介紹:1、對天貓精靈說【…

SWOT分析是神馬?

SWOT分析是思維的工具來理解事物的方式。人生在世,作為一個獨立的實體,不可避免地需要思考的問題。除非你是豬。豬比這更聰明。眠質量,都要完爆白領,藍領和金領們。SWOT分析分為四個象限。我們用一頭名豬——麥兜來打個例如就清楚…

hive 日誌怎麼查看_Hive各個日志里都存放了什么信息?

審計日志首先,對于審計日志來說,記錄了某個時間點某個用戶從哪個IP發起對HiveServer或者MetaStore的請求以及記錄執行的語句是什么。如下的HiveServer審計日志,表示在2016-02-01 14:51:22 用戶user_chen向HiveServer發起了show tables請求&am…

語音媒體和信令的測試軟件,IP多媒體子系統信令分析工具的設計與實現

摘要:IP多媒體子系統(InternetProtocolMultimediaSubsystem,IMS)為基于IP的移動和固定通信融合提供了基礎,并被業界認為是網絡演進的一個重要階段.與此同時,信令分析工具一直被電信運營商,設備供應商,測試儀器廠商廣泛而深入的關注.一款優秀的信令分析工具,可以使設…

大小寫轉換

1 ;小寫字母的ASCII碼比大寫字母的ASCII碼的值大20H。2 ;比如大寫字母A的ASCII值為01000001 小寫字母a的ASCII碼為:011000013 ;公式為 a(01100001) - 20H(100000) A(01000001)4 ;A(01000001) 20H(100000) a(01100001)5 assume cs:codesg,ds:datasg6 7 datasg seg…

四象限法推導lm曲線_試用幾何方法推導IS曲線(四象限法)

【簡答題】請根據自己的實際情況,撰寫一份適合自己的“征婚啟事”。內容積極健康。文體,字數等不限【填空題】由一棵二叉樹的前序序列和 序列可唯一確定這棵二叉樹。 (1.0分)【判斷題】完全二叉樹一定是滿二查樹。 (1.0分)【判斷題】二叉樹的前序遍歷中,任意一個結點均處于其子…

IDE-Ecplise-代碼注釋 模版 編碼規范 配色

說明: 代碼注釋主要用于方便代碼后期維護,編碼規范,增加代碼閱讀性和維護性。因網上看到的很多博客中片段局多,故整理后重寫一篇,方便交流學習。 先看下加過注釋模版后的效果。如上圖所示,創建類&#xff0…

通過路由遠程計算機重啟,華為無線路由器三種常用重啟的方法

日常重啟無線路由器并不是一個高難度動作,但是你了解華為(HUAWEI)家用無線路由器的三種常用的重啟的方法嗎?這三種方法也適用于絕大多數品牌的路由器,只不過在某個細節上略有區別。華為路由器的三種常用重啟方法分別是:硬重啟、軟…