驗證控件與Button的OnClientClick事件詳細(xì)解析
一、事件
這是一個長期被我忽略或者是沒有發(fā)現(xiàn)的問題,問題是這樣的:
在一個頁面中,當(dāng)有驗證控件的時候,當(dāng)Button控件觸發(fā)OnClientClick事件,并且這個事件會返回true和false的時候,驗證控件就會失效,不起作用了。具體描述如下:
.Net頁面如下:
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div>
<asp:TextBox ID="TextBoxTest" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBoxTest"
ErrorMessage="不能為空" Display="None"></asp:RequiredFieldValidator><ajaxToolkit:ValidatorCalloutExtender
ID="ValidatorCalloutExtender1" TargetControlID="RequiredFieldValidator1" runat="server">
</ajaxToolkit:ValidatorCalloutExtender>
<asp:Button ID="ButtonText" runat="server" Text="測試" OnClientClick="return confirm('你確定要提交嗎?');" />
</div>
</form>
如上,在頁面中加入RequireFieldValidator驗證控件,使TextBoxTest的值不能為空,在ButtonText提交頁面時,要用戶確認(rèn)是否需要提交。很簡單的一個頁面,貌似也沒有什么問題。可是當(dāng)TextBoxTest的值為空的時候,驗證控件竟然不起作用,提交頁面成功。這是什么原因呢?
二、響應(yīng)事件
這是怎么回事呢?首先我將ButtonTest的OnClientClick事件去掉后,驗證控件是起作用的。這又是為什么呢?我查看了頁面的源代碼,發(fā)現(xiàn)ButtonTest控件生成如下源代碼:
<input type="submit" name="ButtonText" value="測試" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ButtonText", "", true, "", "", false, false))" id="ButtonText" />
從這行源代碼可以看出,驗證控件在客戶端生成了一段javascript代碼,驗證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í)行驗證控件生成的這一段javascript,顯然,在這種情況下,驗證控件就失去任何意義了。
三、響應(yīng)控件
知道了問題處在什么地方,就好辦了,我的解決辦法是:在執(zhí)行自定義的javascript(return confirm('你確定要提交嗎?‘)前 ,就要驗證頁面中的控件是否符合規(guī)則,于是我將ButtonTest的OnClientClick事件修改如下:
<asp:Button ID="ButtonText" runat="server" Text="測試" OnClientClick="if(CheckClientValidate()) return Confirm('你確定要提交頁面嗎?');" />
CheckClientValidate()方法的代碼如下:
<script language="javascript" type="text/javascript">
function CheckClientValidate(){
Page_ClientValidate();
if (Page_IsValid){
return true;
}else{
return false;
}
}
</script>
運行,測試。驗證控件發(fā)揮作用。問題解決。
四、后記
這就是被我已知忽略的問題和解決方案,當(dāng)我發(fā)覺這個問題的時候,冒出了一身冷汗,幸虧做了嚴(yán)格的服務(wù)器端驗證,不然可就慘了。從這里也可以看出指定嚴(yán)格的服務(wù)器端驗證是多么的有必要啊:-)。它不僅可以防止”黑客“繞過客戶端驗證,還可以防止因為自己沒有發(fā)覺的錯誤,造成數(shù)據(jù)的不準(zhǔn)確。
注:
Page_ClientValidate(),本函數(shù)用于在包含微軟驗證控件的aspx頁面中,根據(jù)用戶輸入操作是否合法,返回True或者False
可直接判斷。
if(Page_ClientValidate())
{
return true;
}
else
{
return false;
}
- jQuery Validate 驗證,校驗規(guī)則寫在控件中的具體實例
- ASP.NET jQuery 實例16 通過控件CustomValidator驗證RadioButtonList
- ASP.NET jQuery 實例15 通過控件CustomValidator驗證CheckBoxList
- 使用jQuery.Validate進行客戶端驗證(初級篇) 不使用微軟驗證控件的理由
- 基于jquery實現(xiàn)的服務(wù)器驗證控件的啟用和禁用代碼
- 教你用AngularJS框架一行JS代碼實現(xiàn)控件驗證效果
- js控制.net驗證控件是否可用。
- fileupload控件 文件類型客戶端驗證實現(xiàn)代碼
- asp.net MaxLengthValidator 最大長度驗證控件代碼
- jQuery密碼強度驗證控件使用詳解
相關(guān)文章
javascript Three.js創(chuàng)建文字初體驗
這篇文章主要為大家介紹了Three.js創(chuàng)建文字初體驗,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-11-11
JavaScript利用生成器函數(shù)實現(xiàn)優(yōu)雅處理異步任務(wù)流
Generators?是?JavaScript?中的一種特殊函數(shù),它們可以暫停執(zhí)行并根據(jù)需要生成多個值,本文將詳細(xì)介紹?generators?的作用、用法以及與其他語言特性的配合使用,希望對大家有所幫助2023-07-07
js獲取數(shù)組最后一位元素的五種方法及執(zhí)行效率對比
js獲取數(shù)組最后一位元素的五種方法代碼示例,使用console.time和console.timeEnd測量javascript腳本程序執(zhí)行效率對比2023-08-08

