一、事件
這是一個(gè)長期被我忽略或者是沒有發(fā)現(xiàn)的問題,問題是這樣的:
在一個(gè)頁面中,當(dāng)有驗(yàn)證控件的時(shí)候,當(dāng)Button控件觸發(fā)OnClientClick事件,并且這個(gè)事件會(huì)返回true和false的時(shí)候,驗(yàn)證控件就會(huì)失效,不起作用了。具體描述如下:
.Net頁面如下:
二、響應(yīng)事件
這是怎么回事呢?首先我將ButtonTest的OnClientClick事件去掉后,驗(yàn)證控件是起作用的。這又是為什么呢?我查看了頁面的源代碼,發(fā)現(xiàn)ButtonTest控件生成如下源代碼:
<input type="submit" name="ButtonText" value="測試" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ButtonText", "", true, "", "", false, false))" id="ButtonText" />
從這行源代碼可以看出,驗(yàn)證控件在客戶端生成了一段javascript代碼,驗(yàn)證TextBox中的值是否為空。當(dāng)我加上ButtonTest的OnClientClick后,我重新查看了源代碼,ButtonTest控件生成的源代碼如下:
<input type="submit" name="ButtonText" value="測試" onclick="return confirm('你確定要提交嗎?');WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ButtonText", "", true, "", "", false, false))" id="ButtonText" />
從這行代碼中,可以非常清楚的看到問題處在什么地方了,在客戶端,首先執(zhí)行的是自定義的javascript,然后在執(zhí)行驗(yàn)證控件生成的這一段javascript,顯然,在這種情況下,驗(yàn)證控件就失去任何意義了。
三、響應(yīng)控件
知道了問題處在什么地方,就好辦了,我的解決辦法是:在執(zhí)行自定義的javascript(return confirm('你確定要提交嗎?‘)前 ,就要驗(yàn)證頁面中的控件是否符合規(guī)則,于是我將ButtonTest的OnClientClick事件修改如下:
四、后記
這就是被我已知忽略的問題和解決方案,當(dāng)我發(fā)覺這個(gè)問題的時(shí)候,冒出了一身冷汗,幸虧做了嚴(yán)格的服務(wù)器端驗(yàn)證,不然可就慘了。從這里也可以看出指定嚴(yán)格的服務(wù)器端驗(yàn)證是多么的有必要啊:-)。它不僅可以防止”黑客“繞過客戶端驗(yàn)證,還可以防止因?yàn)樽约簺]有發(fā)覺的錯(cuò)誤,造成數(shù)據(jù)的不準(zhǔn)確。
注:
Page_ClientValidate(),本函數(shù)用于在包含微軟驗(yàn)證控件的aspx頁面中,根據(jù)用戶輸入操作是否合法,返回True或者False
可直接判斷。
新聞熱點(diǎn)
疑難解答