精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MVC下ASP.NET的表單驗證實現(xiàn)

開發(fā) 后端
MVC下實現(xiàn)表單驗證可以使用多種方法。國外已經(jīng)出現(xiàn)了一些Mvc下使用的驗證框架。本文中提供的方法只是眾多方法之一,可以供學(xué)習(xí)者參考一二。

在Web開發(fā)中,表單提交算是一種很常見的從客戶端獲取數(shù)據(jù)的方式了。然而,用戶的行為永遠(yuǎn)都是無法預(yù)料的。為此,我們在程序中不得已必須對用戶輸入的數(shù)據(jù)進(jìn)行嚴(yán)格效驗。在WebForm時代我們常用的手段是驗證控件,但是到了Mvc時代,再使用控件變得困難了,因此我們必須找到新的方式來解決這個問題。

在實際使用中,我們可以考慮多種形式來進(jìn)行這一驗證(注:本文目前只研究服務(wù)器端驗證的情況),最直接的方式莫過于對每個表單值手動用C#代碼進(jìn)行驗證了,比如:

if(!Int32.TryParse(Request.Form[“age”], out age)){
xxxx…
}
If(age < xxx || age > xxx){
xxxx…
}

 

然而正如上面看到的一樣,這種方式枯燥而繁瑣,需要用戶對每個字段都要手動效驗,或許開發(fā)人員的一不小心就會造成系統(tǒng)的漏洞。因此,制造出一個能對這種行為進(jìn)行自動進(jìn)行的輪子勢在必行,當(dāng)然,到本文寫作的時候為止,國外已經(jīng)出現(xiàn)了一些Mvc下使用的驗證框架,然而天下輪子不怕多,我在此厚顏再造出個,只希望不被冠上山寨之名。

該框架的締造源自4MVC團(tuán)隊的Infancy項目,去年年底開始這個項目的時候,正是mvc框架加入ModelBinder的時候,當(dāng)時便想到了通過使用ModelBinder來實現(xiàn)一種服務(wù)器端自動驗證框架,經(jīng)過多次修改,該框架慢慢實現(xiàn)了我需要的功能,本系列文章將再次回顧該過程,將該框架的一步步的實現(xiàn)過程加以更細(xì)致的重現(xiàn)。

下面正式開始框架的開發(fā),首先我們明確下我們的基本需求:

1.該框架針對簡單實體類(POCO)

2.該框架能自動對實體類的屬性進(jìn)行效驗

3.該實體能被ModelBinder使用

4.能方便或者自動的執(zhí)行該效驗,并取得效驗結(jié)果和信息

為了實現(xiàn)上面的目標(biāo),我們首先來確定一些需要使用的技術(shù)手段:

1.要能訪問任意POCO的屬性,必然用到反射

2.要能對屬性進(jìn)行限制,可選擇使用XML或者Attribute,對程序員來說,Attribute遠(yuǎn)比XML來的方便和友好,因此選擇Attribute

3.實現(xiàn)實體驗證方法,可能會使用Command模式,也可能不需要

下面開始我們的實踐了,首先我們考慮測試代碼,假設(shè)我擁有實體Student,Student擁有屬性Source,要求Source是int類型,且范圍為0-100,那么測試代碼的模式應(yīng)該如下:

Student student = new Student(){
Source = -1
};
bool validateResult = student.Validate();
Assert.IsFalse(validateResult);

 

也就是說,我們需要在一個驗證方法中對該對象的所有屬性進(jìn)行驗證,那么我們考慮對系統(tǒng)各部分的構(gòu)建,首先我們需要一個RangeAttribute,這個類能包含對屬性的驗證信息,大致如下:

public class RangeAttribute : Attribute{
public int Mix{ get; set; } //范圍下限
public int Max{ get; set; } //范圍上限
public string Message{ get; set;} //出錯信息

public RangeAttribute(int min, int max, string message){
Min = min;
Max = max;
Message = message;
}
}


這樣一來我們的Student就可以如此構(gòu)造

public class Student{
[Range(0, 100, “分?jǐn)?shù)的范圍必須在{0}和{1}之間.”)]
public int Source{ get; set; }
}


然而,這樣僅僅是個花架子,在默認(rèn)情況下這個Range沒有起到任何作用,除了程序員看到代碼之后知道了Source有這樣的限制要求,那么,我們需要如何將這個Attribute和驗證結(jié)合起來呢?自然就是反射。

#p#

我們在Student中實現(xiàn)如下方法:

public bool Validate(){
bool result = true;
Type type = this.GetType();
PropertyInfo property = type.GetProperty(“Source”); //獲取Source屬性
RangeAttribute [] attributes =
property.GetCustomAttributes(typeof(Attribute), true)
as RangeAttribute []; //獲取Range屬性集合
//遍歷集合對屬性進(jìn)行驗證
foreach(var item in attribute){
int value = (int)property.GetValue(this, null);
if(value < item.Min || value > item.Max){
result = false;
}
}
return result;
}


那么再回過頭看先前的測試,我們可以發(fā)現(xiàn),測試成功運行了(相關(guān)代碼見附帶項目的Leven.Validate01和test項目Validate01Test.cs).

我們在看目前的代碼,現(xiàn)在我們能測試Source,如果我們的Student類中還有一項Age,范圍為6-150呢,那么Student中加上如下代碼:

[Range(6, 150, "學(xué)生年齡必須在{0}和{1}之間.")]
public int Age { get; set; }
那么我們的Validate方法是否能正確驗證呢?為了驗證結(jié)果,我們重新編寫測試:

[TestMethod()]
public void ValidateTest() {
Student student = new Student() {
Source = 80,
Age = 0
};
bool validateResult = student.Validate();
Assert.IsFalse(validateResult);
student.
validateResult = student.Validate();
}


執(zhí)行測試,很遺憾,測試無法通過了.我們可以再看看Validate方法,可以發(fā)現(xiàn),其中只對Source屬性進(jìn)行了驗證,那么我們可以想辦法修改代碼,讓其能對Age和Source方法同時驗證。

public bool Validate() {
bool result = true;
Type type = this.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach (var property in properties) {
RangeAttribute[] attributes =
property.GetCustomAttributes(typeof(RangeAttribute), true) as RangeAttribute[];
foreach (var item in attributes) {
int value = (int)property.GetValue(this, null);
if (value < item.Min || value > item.Max) {
result = false;
}
}
}
return result;
}


修改過的方法中將遍歷所有的屬性,然后進(jìn)行驗證,這時候再次運行測試,生動的綠色代表我們重新獲得了成功。

下面我們再次考慮新的可能情況,如果Student需要一個Name屬性,這是一個必須字段.我們考慮新增一個RequiredAttribute來實現(xiàn)該功能,該部分代碼如下(參見項目Leven.Validate03):

[AttributeUsage(AttributeTargets.Property)]
public class RequiredAttribute : Attribute {
public bool IsRequired { get; set; }
public string Message { get; set; }
public RequiredAttribute(string message) {
IsRequired = true;
Message = message;
}
}


然后修改Student部分,新增下面部分:

[Required]
public string Name { get; set; }
再次修改測試代碼:

[TestMethod()]
public void ValidateTest() {
Student student = new Student() {
Age = 20,
Source = 89,
Name = string.Empty
};
bool validateResult = student.Validate();
Assert.IsFalse(validateResult);
}


執(zhí)行測試,結(jié)果失敗了.查看原因,顯然可以看到,是Validate方法中

RangeAttribute[] attributes =property.GetCustomAttributes(typeof(RangeAttribute), true) as RangeAttribute[];

只驗證了RangeAttribute,那針對我們加入的RequiredAttribute自然是無能為力了,為了能驗證RequiredAttribute,我們再次修改了代碼:

public bool Validate() {
bool result = true;
bool requiredResult = true;
Type type = this.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach (var property in properties) {
RangeAttribute[] attributes =
property.GetCustomAttributes(typeof(RangeAttribute), true)
as RangeAttribute[]; //獲取RangeAttribute集合
RequiredAttribute[] requiredAttributes =
property.GetCustomAttributes(typeof(RequiredAttribute), true)
as RequiredAttribute[]; //獲取RequiredAttribute集合
//遍歷RangeAttribute進(jìn)行驗證
foreach (var item in attributes) {
int value = (int)property.GetValue(this, null);
if (value < item.Min || value > item.Max) {
result = false;
}
}
//遍歷RequiredAttr進(jìn)行驗證
foreach (var item in requiredAttributes) {
object value = property.GetValue(this, null);
if (value is string) {
if (String.IsNullOrEmpty((value as string))) {
requiredResult = false;
}
} else {
if (value == null) {
requiredResult = false;
}
}
}
}
return result && requiredResult;
}


這次的代碼量增加了不少,不過經(jīng)過我們的不懈努力,測試再一次通過了,但是,我們再次回來查看驗證部分的代碼,不難發(fā)現(xiàn)一個問題,每次我們新增了驗證Attribute之后都必須手動在Validate方法中增加響應(yīng)的代碼,目前我們還只有兩個Attribute,如果一個系統(tǒng)中有20甚至200個Attribute(當(dāng)然只是打個比方),該方法的長度恐怕將是個恐怖的數(shù)字,這樣的方法勢必?zé)o比丑陋。

【編輯推薦】

  1. ASP.Net MVC框架配置與分析
  2. ASP.net中用axWebBrowser中提交表單
  3. MVC詳解 什么是真正的"框架"
責(zé)任編輯:yangsai 來源: ITPUB論壇
相關(guān)推薦

2009-07-20 15:44:32

ASP.NET MVC

2009-07-29 16:47:40

ASP.NET表單身份

2014-04-09 10:18:21

ASP.NETMVC

2009-09-18 10:20:26

PRG數(shù)據(jù)驗證

2009-07-28 14:47:18

ASP.NET MVC

2011-04-12 13:53:25

ASP.NET MVCjQuery

2009-07-29 17:23:17

ASP.NET表單

2009-07-31 12:43:59

ASP.NET MVC

2009-07-24 13:20:44

MVC框架ASP.NET

2009-06-01 10:23:31

asp.net mvcasp.net mvc.net mvc框架

2009-09-10 09:50:47

ASP.NET MVC

2009-07-23 16:59:31

ASP.NET認(rèn)證Form表單

2009-07-22 16:02:39

ASP.NET MVCPagedList

2009-11-24 15:11:21

ASP.NET MVC

2009-07-29 09:59:10

ASP.NET For

2009-07-22 18:07:55

論壇應(yīng)用程序ASP.NET MVC

2009-07-22 09:11:02

Action方法ASP.NET MVC

2009-07-22 10:34:37

ActionInvokASP.NET MVC

2009-08-05 18:22:55

2009-07-22 10:09:59

ASP.NET MVC
點贊
收藏

51CTO技術(shù)棧公眾號

一色桃子久久精品亚洲| 喷白浆一区二区| 日韩精品久久久久久福利| 免费在线观看的av网站| 福利在线观看| 国产成人无遮挡在线视频| 国外成人在线直播| 卡一卡二卡三在线观看| 日韩一区二区三区高清在线观看| 国产很黄免费观看久久| 午夜精品视频网站| 99精品全国免费观看| 亚洲伊人精品酒店| 都市激情亚洲色图| 久久最新免费视频| 久久av少妇| 国产河南妇女毛片精品久久久| 北条麻妃久久精品| 性农村xxxxx小树林| 成人在线高清| 精品久久久久久亚洲国产300| 国产日本一区二区三区| 一级黄色免费看| 国产精品五区| 欧美激情videoshd| 亚洲AV成人无码网站天堂久久| 成人精品电影在线| 亚洲综合成人在线| 免费看啪啪网站| 久久精品蜜桃| 91在线一区二区三区| 亚洲最大福利网| 91福利免费视频| 日精品一区二区三区| 欧美国产欧美亚洲国产日韩mv天天看完整| 色偷偷中文字幕| 九九热线视频只有这里最精品| 欧美国产禁国产网站cc| 国产精品福利视频| 国产视频一二三四区| 免费日本视频一区| 国产成人精品日本亚洲| 日韩精品手机在线| 精品91久久久久| 欧美成人午夜激情在线| 亚洲天堂网av在线| 久久一区二区中文字幕| 伊人久久久久久久久久| 午夜在线观看一区| 精品成人影院| 国产一区二区动漫| 法国空姐电影在线观看| 免费看成人哺乳视频网站| 日韩国产精品一区| 国产精品无码网站| 亚洲春色h网| 亚洲日本欧美日韩高观看| 成人h动漫精品一区| 欧美成人午夜77777| 亚洲大胆美女视频| 精品一区二区视频在线观看| 欧美亚洲大陆| 亚洲欧洲日产国产网站| 日本精品在线观看视频| 成人3d动漫在线观看| 一色桃子一区二区| 九九这里只有精品视频| 欧美黄色免费| 欧美激情亚洲国产| 91蜜桃视频在线观看| 亚洲欧美日韩国产一区| 日韩美女视频免费看| 中文字幕你懂的| 久久99在线观看| 91手机在线观看| 刘亦菲久久免费一区二区| 97aⅴ精品视频一二三区| 欧美日韩高清免费| 黄色片免费在线观看| 一区二区三区欧美在线观看| 国产成人无码精品久久久性色| 99热国产在线| 亚洲国产精品一区二区久久 | aiss精品大尺度系列| 日韩一区二区三区电影| 老司机午夜免费福利| 亚洲尤物av| 日韩天堂在线视频| 久久在线视频精品| 免费看黄裸体一级大秀欧美| 国产欧美日韩中文字幕| www.麻豆av| 久久精品夜夜夜夜久久| 一道本在线观看视频| 91超碰在线免费| 欧洲亚洲国产日韩| av在线免费观看不卡| 偷拍一区二区| 美女啪啪无遮挡免费久久网站| 99国产精品免费| 欧美激情一区| 国产精品久久久精品| 亚洲国产中文字幕在线| 国产欧美日韩三级| 久久久久久久9| 99riav视频一区二区| 欧美大片日本大片免费观看| 国产手机在线观看| 国产精品地址| 国产日韩在线一区| 玖玖综合伊人| 亚洲一区视频在线| 国产3p在线播放| 国产精品欧美三级在线观看| 欧美激情在线视频二区| 亚洲自拍第二页| 久久久久久久av麻豆果冻| 成年人视频大全| 国产精品诱惑| 亚洲人成电影网站色xx| 国产亚洲精品久久久久久无几年桃 | 在线播放91灌醉迷j高跟美女| 中文字幕第38页| 日韩av午夜| 欧美黄色免费网站| 国产乱码久久久| 中文久久乱码一区二区| 欧美xxxxx在线视频| 91蜜桃臀久久一区二区| 亚洲系列中文字幕| 国语对白永久免费| www..com久久爱| 国产免费一区二区视频| 国产免费av国片精品草莓男男| 欧美tk—视频vk| 日本一级特级毛片视频| 男女激情视频一区| 日本不卡久久| 天天综合网天天| 亚洲欧美日韩国产精品| 日本熟妇色xxxxx日本免费看| 男人的天堂亚洲| 国产精品一区视频网站| 手机在线免费av| 日韩欧美一级在线播放| 九九视频在线观看| 国产精品一区二区不卡| www.亚洲一区二区| 99精品视频在线免费播放| 中文字幕亚洲在线| 一级黄色大毛片| 亚洲视频香蕉人妖| 亚洲在线观看网站| 欧美成人综合| 国产福利久久| 毛片电影在线| 亚洲欧洲一区二区三区在线观看| 三级影片在线看| 国产精品18久久久久久久网站| 极品校花啪啪激情久久| 僵尸再翻生在线观看| 精品视频在线观看日韩| 日韩欧美在线观看免费| 久久精品这里都是精品| 一本岛在线视频| 天天做天天爱天天综合网| aaa级精品久久久国产片| 丰满大乳少妇在线观看网站| 亚洲精品久久久久久久久久久久久 | 日韩在线观看中文字幕| 欧美激情免费视频| 天天操天天干天天舔| 色婷婷精品久久二区二区蜜臂av| 中文字幕亚洲日本| 亚洲精品资源| 日韩精品第一页| 97久久精品一区二区三区的观看方式| 亚洲激情自拍图| 亚洲第一网站在线观看| 最新国产精品久久精品| 亚洲精品一二三四| 在线亚洲精品| 亚洲一区三区| 国产精伦一区二区三区| 国产精品久久久久999| 成人日韩欧美| 日韩精品极品毛片系列视频| 在线播放成人av| 亚洲国产成人av| 337人体粉嫩噜噜噜| 国产精品夜夜嗨| 少妇激情一区二区三区| 亚洲欧美文学| 日本不卡一二三区| 亚洲91网站| 国产精品18久久久久久麻辣| 18在线观看的| 亚洲日本欧美中文幕| 亚洲春色一区二区三区| 欧美性猛片aaaaaaa做受| 久久成人国产精品入口| 欧美高清在线精品一区| 欧美激情一区二区三区p站| 秋霞成人午夜伦在线观看| 欧美图片激情小说| 99久久婷婷这里只有精品| 精品国产综合| 亚洲啊v在线免费视频| 国产精品视频成人| 亚洲精品**中文毛片| 欧美xxxx做受欧美| 成人高清网站| 精品视频在线观看日韩| 国产黄色片免费观看| 欧美色图在线观看| 欧美性猛交bbbbb精品| 洋洋av久久久久久久一区| 无码人中文字幕| 久久亚洲一级片| 亚洲av人人澡人人爽人人夜夜| 免费久久99精品国产自在现线| 日本亚洲导航| 婷婷亚洲精品| 国语精品中文字幕| 午夜日韩成人影院| 69久久夜色精品国产69| av在线下载| 久久影院在线观看| 最新真实国产在线视频| 亚洲天堂色网站| 日韩大胆人体| 精品视频www| 亚洲日本国产精品| 精品久久久久99| 丰满人妻一区二区三区无码av| 欧美日韩国产精品专区| 久热这里有精品| 国产精品色哟哟网站| 非洲一级黄色片| 国产无一区二区| 能免费看av的网站| 26uuu精品一区二区在线观看| 潘金莲激情呻吟欲求不满视频| 日韩视频免费在线播放| 免费成人黄色| 日日狠狠久久偷偷四色综合免费| 国产精品亚洲欧美在线播放| 欧美探花视频资源| 亚洲中文无码av在线| 欧美亚洲免费在线一区| а中文在线天堂| 欧美性受xxxx| 一级片一区二区三区| 欧美一区在线视频| www.蜜臀av| 亚洲国产一区自拍| 全部免费毛片在线播放网站| 亚洲欧美国产精品va在线观看| 一区二区三区精彩视频| 欧美夫妻性生活| 99国产揄拍国产精品| 日韩色在线观看| 天堂中文网在线| 亚洲精品一区二区久| 蝌蚪视频在线播放| 日韩一区二区av| 亚洲wwwww| 2025国产精品视频| 成人福利片在线| 51午夜精品| 久久99国产精品久久99大师| 欧美一区亚洲二区| 天天做天天爱天天综合网2021| 日本亚洲自拍| 亚洲蜜桃视频| 国产 日韩 亚洲 欧美| 日韩电影一区二区三区| 午夜大片在线观看| av在线不卡观看免费观看| 国产又粗又猛又爽又黄av| 亚洲欧美另类小说视频| 精品处破女学生| 色哟哟亚洲精品| 99热这里只有精品5| 亚洲大胆人体av| av在线免费观看网| 欧美激情一区二区三区高清视频 | 一区二区三区午夜| 欧美一区二区三区视频免费播放| 一级黄色片在线播放| 亚洲成人精品视频| 91av资源在线| 91精品国产91久久久| 超碰这里只有精品| 国产伦精品一区二区| 青青一区二区三区| 青青草精品视频在线| 久久精品国产99国产| 人妻在线日韩免费视频| 国产精品福利在线播放| 欧美在线观看不卡| 精品日韩一区二区| 92国产在线视频| 欧美夜福利tv在线| 日韩欧美中文在线观看| 亚洲精品国产一区| 亚洲精品日本| 欧美高清精品一区二区| 中文字幕精品一区二区三区精品| 美国美女黄色片| 午夜精品福利一区二区蜜股av| 天堂资源在线播放| 欧美日韩精品一区二区三区四区| 亚洲一区二区视频在线播放| 日韩av在线直播| 亚洲91av| 成人午夜激情免费视频| 少妇精品久久久| 国产真实老熟女无套内射| 国产自产2019最新不卡| 亚洲午夜久久久久久久国产| 五月综合激情日本mⅴ| 国产黄色片网站| 久久久91精品| 农村妇女一区二区| 日本午夜精品电影| 久久综合亚州| 国精产品一区一区三区免费视频| 国产精品私人自拍| 美女又爽又黄免费视频| 精品不卡在线视频| v天堂福利视频在线观看| 国产美女搞久久| 日韩美女一区二区三区在线观看| 99热都是精品| 久久97超碰国产精品超碰| 亚洲精品一区二区三区影院忠贞| 国产精品久久久久久久岛一牛影视 | xvideos.蜜桃一区二区| 在线视频福利一区| 久久精品久久精品| 黄色av片三级三级三级免费看| 一区二区三区四区在线免费观看 | 久久都是精品| 欧美 变态 另类 人妖| 亚洲国产aⅴ天堂久久| 亚洲成熟女性毛茸茸| 久久久久久久久久国产精品| 超碰97久久| 鲁一鲁一鲁一鲁一色| 91丨国产丨九色丨pron| 久久久久99精品成人片三人毛片| 欧美一区二区在线观看| 91最新在线视频| 成人毛片网站| 9色精品在线| 亚洲天堂久久新| 久久美女免费视频| 欧美美女在线直播| 亚洲中文字幕无码av永久| 成人午夜又粗又硬又大| 国产超碰人人爽人人做人人爱| 欧美日韩免费观看一区三区| 日本黄色片在线观看| 亚洲a区在线视频| 国产一区二区三区自拍| www.日本高清| 91高清视频在线| 国产精品实拍| 国产精品一区二区欧美黑人喷潮水| 国产精品二区不卡| 国产又黄又嫩又滑又白| 伊人色综合久久天天| 手机在线观看免费av| 国产精品白嫩美女在线观看| 天天久久综合| 性欧美18—19sex性高清| 色香蕉久久蜜桃| 黄色网页在线播放| 国产一区二区三区无遮挡| 日韩高清中文字幕一区| 波多野结衣亚洲色图| 亚洲美女自拍视频| 久久精品黄色| 国产真人做爰毛片视频直播| 国产亚洲va综合人人澡精品 | 日本少妇毛茸茸| 91激情在线视频| 手机av免费在线| 午夜一区二区三区| 粉嫩13p一区二区三区| 亚洲图片在线视频| 久久福利网址导航| 影视先锋久久| 永久免费看片在线观看| 色婷婷精品大在线视频| 激情影院在线| 一区二区高清视频| 91香蕉视频污| xxxx18国产|