? ??? 數(shù)據(jù)驗(yàn)證涉及到很多方面的東西,在當(dāng)前的技術(shù)領(lǐng)域里,從技術(shù)上來(lái)看可以說(shuō)是分為傳統(tǒng)的驗(yàn)證(同步方式)和Ajax(異步方式)驗(yàn)證。如果從功能驗(yàn)證上來(lái)看的話(huà)就包羅萬(wàn)象了。比如非空驗(yàn)證,對(duì)等驗(yàn)證,格式驗(yàn)證等等。在.NET里還有專(zhuān)門(mén)用于驗(yàn)證的的幾個(gè)常見(jiàn)驗(yàn)證控件,
RequiredFieldValidator
,
RangeValidator
,
RegularExpressionValidator
,
CompareValidator
,
CustomValidator以及
ValidationSummary等,這里不討論他們的使用及原理
。
一. 傳統(tǒng)的驗(yàn)證方式
???? 在傳統(tǒng)的驗(yàn)證中是采用同步表單提交的方法來(lái)處理的驗(yàn)證請(qǐng)求。這種驗(yàn)證方式的缺點(diǎn)很顯然而知了。表單提交一是傳輸?shù)臄?shù)據(jù)量比較大消耗資源,二是頁(yè)面處于同步方式隨著表單的提交會(huì)刷新頁(yè)面。下面我看來(lái)看看一個(gè)簡(jiǎn)單的傳統(tǒng)驗(yàn)證的實(shí)例:
??? 建議一個(gè)ASP.NET項(xiàng)目,將默認(rèn)頁(yè)面改名為: TraditValidation.aspx ,在頁(yè)面.cs里定義一個(gè)模擬數(shù)據(jù)的方法如下:
<
script?language
=
"
javascript
"
>
function
?checkFrm()
{
?????
var
?tbUsername?
=
?document.getElementById(
"
tbUsername
"
);
?????
var
?msg?
=
?document.getElementById(
"
lblMessage
"
);
?????
var
?re?
=
?
/
^(\w{3,15})$
/
gim;
?????
if
?(re.test(tbUsername.value))
?????
{
?????????
return
?
true
;
?????}
?????
else
?????
{
?????????msg.innerHTML?
=
?
"
長(zhǎng)度必須在3到15之間,且不包含字母、數(shù)字和下劃線(xiàn)以外的字符!
"
;
????msg.style.color?
=
?
"
red
"
;
????
return
?
false
;
?????}
}
<
/
script>
??? 轉(zhuǎn)到設(shè)計(jì)視圖,給頁(yè)面上放置兩個(gè)Lebal,一個(gè)TextBox,一個(gè)Button控件并適當(dāng)?shù)脑O(shè)置屬性,html代碼如下:
<
form?
id
="Form1"
?method
="post"
?runat
="server"
?onsubmit
="return?checkFrm()"
>
<
asp:Label?
id
="Label2"
?runat
="server"
?Font-Names
="黑體"
?Font-Bold
="True"
?Font-Size
="X-Large"
>
傳統(tǒng)的數(shù)據(jù)驗(yàn)證
</
asp:Label
>
<
hr
>
<
div
>
用戶(hù)名:
</
div
>
<
asp:textbox?
id
="tbUsername"
?runat
="server"
></
asp:textbox
>
<
asp:button?
id
="btnVerify"
?runat
="server"
?Text
="檢查用戶(hù)名"
?OnClick
="btnVerify_Click"
></
asp:button
>
<
br
>
<
asp:label?
id
="lblMessage"
?runat
="server"
?ForeColor
="Tomato"
></
asp:label
>
</
form
>
??? 下面轉(zhuǎn)到代碼視圖下去寫(xiě)btnVerify的單擊事件方法:
???? 運(yùn)行這個(gè)程序頁(yè)面,當(dāng)我門(mén)點(diǎn)擊按扭的時(shí)候,提交表單并且頁(yè)面刷新。下面是運(yùn)行后的界面圖:
-----------------------------------------------------------------------------------------------------------
二. Ajax驗(yàn)證方式
??? 上面的實(shí)例展示了傳統(tǒng)的驗(yàn)證方式的過(guò)程,原理是用的表單提交同步的方法執(zhí)行的。下面我們來(lái)看看Ajax的驗(yàn)證方式與傳統(tǒng)的驗(yàn)證方式有什么不同,在 上一篇文章 中講到XmlHttpRequest對(duì)象的異步請(qǐng)求實(shí)現(xiàn)Ajax功能。接下來(lái)還是通過(guò)一個(gè)使用XmlHttpRequest對(duì)象的實(shí)例來(lái)說(shuō)明Ajax驗(yàn)證方法的過(guò)程。
????在上面建立的ASP.NET項(xiàng)目里新建立一個(gè)一般處理程序文件,命名為:AjaxHandler.ashx,同上在里面定義一個(gè)模擬數(shù)據(jù)字典的方法用來(lái)檢測(cè)用戶(hù)名是否存在IsUsernameExist(string strUsername)和一個(gè)驗(yàn)證數(shù)據(jù)合法性的方法IsValidUsername(string strUsername);詳細(xì)定義如下:
??? IsUsernameExist()方法的詳細(xì)定義:
???? IsValidUsername()方法的詳細(xì)定義:
?????? 見(jiàn)于Ajax的運(yùn)行步驟:創(chuàng)建對(duì)象---發(fā)送請(qǐng)求---響應(yīng)請(qǐng)求---處理返回?cái)?shù)據(jù)。
????? 下面我們來(lái)看看客戶(hù)端JavaScript方法的定義,第一篇文章里我提過(guò),要使用一個(gè)對(duì)象事先得創(chuàng)建一個(gè)對(duì)象的實(shí)例吧,在這里又將使用到XmlHttpRequest對(duì)象,所以我門(mén)先來(lái)定義一個(gè)方法創(chuàng)建XmlHttpRequest對(duì)象:
?????? 定義一個(gè)向服務(wù)器發(fā)送請(qǐng)求的方法;
?????? 到這里通過(guò)分析上面的方法,已經(jīng)創(chuàng)建好了XmlHttpRequest對(duì),并定義好了向服務(wù)器發(fā)送請(qǐng)求的方法,指定了想AjaxHandler.ashax發(fā)起請(qǐng)求并傳遞一個(gè)參數(shù)給服務(wù)器端。那服務(wù)器是怎么處理這個(gè)請(qǐng)求的呢?下面我們來(lái)看看服務(wù)器端的處理過(guò)程的定義,在一般處理程序里,當(dāng)請(qǐng)求發(fā)送給他過(guò)后是通過(guò)其內(nèi)的一個(gè)叫 ProcessRequest ()?的方法來(lái)處理的,那么在這里我門(mén)要處理客戶(hù)端發(fā)送過(guò)來(lái)的請(qǐng)求,是不是就應(yīng)該修改ProcessRequest()方法的實(shí)現(xiàn)呢?答案是肯定的,如下:
?????? 分析上面代碼,如果用戶(hù)名不合法則返回1,如果存在則返回2,否則返回0,那么客戶(hù)端的處理返回該怎么去定義呢?很顯然是依賴(lài)于服務(wù)器端返回的這些數(shù)據(jù)了??蛻?hù)端回調(diào)方法的詳細(xì)定義如下:
????? 到這里客戶(hù)端方法和服務(wù)器處理程序都OK了,下面我門(mén)在客戶(hù)段來(lái)調(diào)用方法向服務(wù)器發(fā)送請(qǐng)求看看效果:
<
form?
id
="form1"
?runat
="server"
>
????
<
asp:Label?
id
="Label2"
?runat
="server"
?Font-Names
="黑體,Arial?Black"
?Font-Bold
="True"
?Font-Size
="X-Large"
>
???????基于AJAX的數(shù)據(jù)驗(yàn)證
</
asp:Label
>
????
<
hr
>
????
<
asp:Label?
id
="Label1"
?runat
="server"
>
用戶(hù)名:
</
asp:Label
>
????
<
input?
id
="tbUsername"
?type
="text"
?onkeyup
="CheckUsername(this.value)"
/>
????
<
br
>
????
<
div?
id
="msg"
></
div
>
????
</
form
>
?????? 運(yùn)行結(jié)果如下所示:
本文實(shí)例源代碼下載
????
一. 傳統(tǒng)的驗(yàn)證方式
???? 在傳統(tǒng)的驗(yàn)證中是采用同步表單提交的方法來(lái)處理的驗(yàn)證請(qǐng)求。這種驗(yàn)證方式的缺點(diǎn)很顯然而知了。表單提交一是傳輸?shù)臄?shù)據(jù)量比較大消耗資源,二是頁(yè)面處于同步方式隨著表單的提交會(huì)刷新頁(yè)面。下面我看來(lái)看看一個(gè)簡(jiǎn)單的傳統(tǒng)驗(yàn)證的實(shí)例:
??? 建議一個(gè)ASP.NET項(xiàng)目,將默認(rèn)頁(yè)面改名為: TraditValidation.aspx ,在頁(yè)面.cs里定義一個(gè)模擬數(shù)據(jù)的方法如下:
?1
///
?
<summary>
?2
///
?模擬一個(gè)數(shù)據(jù)字典.判斷用戶(hù)名是否存在
?3
///
?
</summary>
?4
///
?
<param?name="strUsername"></param>
?5
///
?
<returns></returns>
?6
private
?
bool
?IsUsernameExist(
string
?strUsername)
?7
{
?8
???
bool
?bRet?
=
?
false
;
?9
10
???
switch
?(strUsername.ToLower())
11
???
{
12
??????
case
?
"
beniao
"
:
13
??????
case
?
"
java
"
:
14
??????
case
?
"
admin
"
:
15
??????
case
?
"
ajax
"
:
16
??????
case
?
"
aspnet
"
:
17
??????bRet?
=
?
true
;?
break
;
18
????}
19
????
return
?bRet;
20
}
???? 接下來(lái)轉(zhuǎn)到
TraditValidation.aspx的html視圖下,定義一個(gè)JavaScript方法來(lái)驗(yàn)證輸入數(shù)據(jù)的合法性。

?2

?3

?4

?5

?6

?7

?8

?9

10

11

12

13

14

15

16

17

18

19

20



















??? 轉(zhuǎn)到設(shè)計(jì)視圖,給頁(yè)面上放置兩個(gè)Lebal,一個(gè)TextBox,一個(gè)Button控件并適當(dāng)?shù)脑O(shè)置屬性,html代碼如下:









?1
protected
?
void
?btnVerify_Click(
object
?sender,?EventArgs?e)
?2
{
?3
????
if
?(IsUsernameExist(tbUsername.Text))
?4
????
{
?5
????????lblMessage.Text?
=
?
"
用戶(hù)名存在!
"
;
?6
????????lblMessage.ForeColor?
=
?Color.Green;
?7
????}
?8
????
else
?9
????
{
10
????????lblMessage.Text?
=
?
"
用戶(hù)名不存在!
"
;
11
????????lblMessage.ForeColor?
=
?Color.Red;
12
????}
13
}

?2

?3

?4

?5

?6

?7

?8

?9

10

11

12

13

???? 運(yùn)行這個(gè)程序頁(yè)面,當(dāng)我門(mén)點(diǎn)擊按扭的時(shí)候,提交表單并且頁(yè)面刷新。下面是運(yùn)行后的界面圖:

-----------------------------------------------------------------------------------------------------------
二. Ajax驗(yàn)證方式
??? 上面的實(shí)例展示了傳統(tǒng)的驗(yàn)證方式的過(guò)程,原理是用的表單提交同步的方法執(zhí)行的。下面我們來(lái)看看Ajax的驗(yàn)證方式與傳統(tǒng)的驗(yàn)證方式有什么不同,在 上一篇文章 中講到XmlHttpRequest對(duì)象的異步請(qǐng)求實(shí)現(xiàn)Ajax功能。接下來(lái)還是通過(guò)一個(gè)使用XmlHttpRequest對(duì)象的實(shí)例來(lái)說(shuō)明Ajax驗(yàn)證方法的過(guò)程。
????在上面建立的ASP.NET項(xiàng)目里新建立一個(gè)一般處理程序文件,命名為:AjaxHandler.ashx,同上在里面定義一個(gè)模擬數(shù)據(jù)字典的方法用來(lái)檢測(cè)用戶(hù)名是否存在IsUsernameExist(string strUsername)和一個(gè)驗(yàn)證數(shù)據(jù)合法性的方法IsValidUsername(string strUsername);詳細(xì)定義如下:
??? IsUsernameExist()方法的詳細(xì)定義:
?1
///
?
<summary>
?2
????
///
?模擬一個(gè)數(shù)據(jù)字典.判斷用戶(hù)名是否存在
?3
????
///
?
</summary>
?4
????
///
?
<param?name="strUsername"></param>
?5
????
///
?
<returns></returns>
?6
????
private
?
bool
?IsUsernameExist(
string
?strUsername)
?7
????
{
?8
????????
bool
?bRet?
=
?
false
;
?9
????????
//
在實(shí)際的項(xiàng)目應(yīng)用中下面就可以去執(zhí)行數(shù)據(jù)庫(kù)查詢(xún)進(jìn)行驗(yàn)證
10
????????
switch
?(strUsername.ToLower())
11
????????
{
12
????????????
case
?
"
beniao
"
:
13
????????????
case
?
"
java
"
:
14
????????????
case
?
"
admin
"
:
15
????????????
case
?
"
ajax
"
:
16
????????????
case
?
"
aspnet
"
:
17
????????????????bRet?
=
?
true
;?
break
;
18
????????}
19
????????
return
?bRet;
20
????}

?2

?3

?4

?5

?6

?7

?8

?9

10

11

12

13

14

15

16

17

18

19

20

???? IsValidUsername()方法的詳細(xì)定義:
1
///
?
<summary>
2
????
///
?驗(yàn)證字符串是否是3-15位
3
????
///
?
</summary>
4
????
///
?
<param?name="strUsername"></param>
5
????
///
?
<returns></returns>
6
????
private
?
bool
?IsValidUsername(
string
?strUsername)
7
????
{
8
????????
return
?(System.Text.RegularExpressions.Regex.IsMatch(strUsername,?
@"
^(\w{3,15})$
"
));
9
????}

2

3

4

5

6

7

8

9

?????? 見(jiàn)于Ajax的運(yùn)行步驟:創(chuàng)建對(duì)象---發(fā)送請(qǐng)求---響應(yīng)請(qǐng)求---處理返回?cái)?shù)據(jù)。
????? 下面我們來(lái)看看客戶(hù)端JavaScript方法的定義,第一篇文章里我提過(guò),要使用一個(gè)對(duì)象事先得創(chuàng)建一個(gè)對(duì)象的實(shí)例吧,在這里又將使用到XmlHttpRequest對(duì)象,所以我門(mén)先來(lái)定義一個(gè)方法創(chuàng)建XmlHttpRequest對(duì)象:
?1
????
var
?xmlHttp;
?2
????
function
?createXMLHttpRequest()
?3
????
{
?4
????????
if
(window.ActiveXObject)
?5
????????
{
?6
????????????xmlHttp?
=
?
new
?ActiveXObject(
"
Microsoft.XMLHTTP
"
);
?7
????????}
?8
????????
else
?
if
(window.XMLHttpRequest)
?9
????????
{
10
????????????xmlHttp?
=
?
new
?XMLHttpRequest();
11
????????}
12
????}

?2

?3

?4

?5

?6

?7

?8

?9

10

11

12

?????? 定義一個(gè)向服務(wù)器發(fā)送請(qǐng)求的方法;
?1
????
//
處理方法
?2
????
function
?CheckUsername()
?3
????
{
?4
????????createXMLHttpRequest();
?5
????????
var
?strName
=
document.getElementById(
"
tbUsername
"
).value;
?6
????????
var
?url
=
?
"
AjaxHandler.ashx?strUsername=
"
+
strName;
?7
????????xmlHttp.open(
"
GET
"
,url,
true
);
?8
????????xmlHttp.onreadystatechange
=
ShowResult;
?9
????????xmlHttp.send(
null
);
10
????}
?????

?2

?3

?4

?5

?6

?7

?8

?9

10

?????? 到這里通過(guò)分析上面的方法,已經(jīng)創(chuàng)建好了XmlHttpRequest對(duì),并定義好了向服務(wù)器發(fā)送請(qǐng)求的方法,指定了想AjaxHandler.ashax發(fā)起請(qǐng)求并傳遞一個(gè)參數(shù)給服務(wù)器端。那服務(wù)器是怎么處理這個(gè)請(qǐng)求的呢?下面我們來(lái)看看服務(wù)器端的處理過(guò)程的定義,在一般處理程序里,當(dāng)請(qǐng)求發(fā)送給他過(guò)后是通過(guò)其內(nèi)的一個(gè)叫 ProcessRequest ()?的方法來(lái)處理的,那么在這里我門(mén)要處理客戶(hù)端發(fā)送過(guò)來(lái)的請(qǐng)求,是不是就應(yīng)該修改ProcessRequest()方法的實(shí)現(xiàn)呢?答案是肯定的,如下:
?1
????
public
?
void
?ProcessRequest?(HttpContext?context)?
?2
????
{
?3
????????context.Response.ContentType?
=
?
"
text/plain
"
;
?4
????????
string
?flag?
=
?
string
.Empty;
?5
????????
string
?strUsername?
=
?context.Request.QueryString[
0
];
?6
????????
if
?(
!
IsValidUsername(strUsername))
?7
????????
{
?8
????????????flag?
=
??
"
1
"
;
?9
????????}
10
????????
else
?
if
?(
!
IsUsernameExist(strUsername))
11
????????
{
12
????????????flag?
=
?
"
2
"
;
13
????????}
14
????????
else
15
????????
{
16
????????????flag?
=
?
"
0
"
;
17
????????}
18
????????context.Response.Write(flag);
19
????}

?2

?3

?4

?5

?6

?7

?8

?9

10

11

12

13

14

15

16

17

18

19

?????? 分析上面代碼,如果用戶(hù)名不合法則返回1,如果存在則返回2,否則返回0,那么客戶(hù)端的處理返回該怎么去定義呢?很顯然是依賴(lài)于服務(wù)器端返回的這些數(shù)據(jù)了??蛻?hù)端回調(diào)方法的詳細(xì)定義如下:
?1
//
回調(diào)方法
?2
function?ShowResult()
?3
{
?4
???
if
(xmlHttp.readyState
==
4
)
?5
???
{
?6
???????
if
(xmlHttp.status
==
200
)
?7
????????
{
?8
???????????var?bRet?
=
?xmlHttp.responseText;
?9
???????
if
?(bRet?
==
?
"
0
"
)
10
???????
{
11
??????????msg.innerHTML?
=
?
'
用戶(hù)名存在!
'
;
12
??????????msg.style.color?
=
?
'
green
'
;
13
???????}
14
???????
else
?
if
?(bRet?
==
?
"
1
"
)
15
???????
{
16
??????????msg.innerHTML?
=
?
'
用戶(hù)名長(zhǎng)度必須在3到15之間,且不包含字母、數(shù)字和下劃線(xiàn)以外的字符!
'
;
17
??????????????msg.style.color?
=
?
'
red
'
;
18
???????}
19
???????
else
20
???????
{
21
?????????msg.innerHTML?
=
?
'
用戶(hù)名不存在!
'
;
22
?????????msg.style.color?
=
?
'
red
'
;
23
???????}
????????????
24
???????}
25
???}
26
}

?2

?3

?4

?5

?6

?7

?8

?9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

????? 到這里客戶(hù)端方法和服務(wù)器處理程序都OK了,下面我門(mén)在客戶(hù)段來(lái)調(diào)用方法向服務(wù)器發(fā)送請(qǐng)求看看效果:










?????? 運(yùn)行結(jié)果如下所示:

本文實(shí)例源代碼下載
????
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
