Asp.net中服务端控件事件是如何触发的(笔记)
3.每個(gè)會(huì) 引發(fā)服務(wù)端事件的控件都會(huì)在響應(yīng)的客戶端事件中調(diào)用上面的代碼: 比如,HtmlControls 中的 Type為button的HtmlInputButton的點(diǎn)擊 事件 <!―客戶端 的點(diǎn)擊事件調(diào)用__doPostBack,eventTarget 參數(shù)為'Button2',表示是name為'Button2’控件觸 發(fā)的事件,eventArgument 為空,表示這個(gè)Type為button的HtmlInputButton只有一 個(gè)客戶端觸發(fā)的服務(wù)端事件--> <input language="javascript" Button2','')" type="button" value="Button" /> 又比如,TextBox控件的Change事件 <!―客戶端 的onchange事件調(diào)用__doPostBack,eventTarget 參數(shù)為’TextBox1’,表示是name為’TextBox1’控件觸 發(fā)的事件,而TextBox控件只有一個(gè)客戶端觸發(fā)的服務(wù)端事件TextChanged,故服 務(wù)器就會(huì)去觸發(fā)這個(gè)TextBox的TextChanged事件-> <input type="text" TextBox1','')" language="javascript" /> 4.客戶端 觸發(fā)事件后調(diào)用__doPostBack方法,將表示觸發(fā)的控件源的eventTarget 和事件參數(shù)eventArgument分別付給 兩個(gè)隱藏域__EVENTTARGET和__EVENTARGUMENT,然后 提交Form,在服務(wù)端根據(jù)__EVENTTARGET和__EVENTARGUMENT來(lái)判斷 是哪個(gè)控件的什么事件觸發(fā)了。 第二章、?PostBack的原理 __doPostBack是一個(gè)純粹并且是非常簡(jiǎn)單的javascript函數(shù),大部分的頁(yè)面PostBack都是由它觸發(fā)的。注意,這里是“大部分”,因?yàn)橹挥袃蓚€(gè)Web Server Control??? 會(huì)自己觸發(fā)頁(yè)面的PostBack,其它的所有控件都是通過(guò)__doPostBack函數(shù)觸發(fā)頁(yè)面的PostBack,那先來(lái)看一下這個(gè)函數(shù)的定義吧: CODE1: <input type="hidden" value="" /> <input type="hidden" value="" /> function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } } 通過(guò)上面的代碼可以看到,__doPostBack帶有兩個(gè)參數(shù),eventTarget是標(biāo)識(shí)將要引發(fā)頁(yè)面PostBack的控件ID,eventArgument參數(shù)提供了在引發(fā)頁(yè)面PostBack事件時(shí)所帶的額外參數(shù)。當(dāng)然這個(gè)函數(shù)被函數(shù)時(shí),這兩個(gè)參數(shù)的 值將賦值給頁(yè)面的兩個(gè)隱含變量__EVENTTARGET和__EVENTARGUMENT,然后調(diào)用頁(yè)面的submit方法提交頁(yè)面表單。這就是為什么我們可以通過(guò)Request.Form[“__EVENTTARGET”]獲取得到引發(fā)頁(yè)面PostBack的控件ID的原因。 了解了__doPostBack函數(shù)后,我們可以很容易的利用它非常方便地自己觸發(fā)自定義的PostBack事件。那上面也說(shuō)了,大部分的控件都是調(diào)用 第三章 Button PostBack做法
下面來(lái)簡(jiǎn)單看一下頁(yè)面PostBack的原理,和Button,ImageButton PostBack的特殊性。
__doPostBack 是一個(gè)純粹并且是非常簡(jiǎn)單的javascript函數(shù),大部分的頁(yè)面PostBack都是由它觸發(fā)的。注意,這里是“大部分”,因?yàn)橹挥袃蓚€(gè)Web Server Control 會(huì)自己觸發(fā)頁(yè)面的PostBack,其它的所以控件都是通過(guò)__doPostBack函數(shù)觸發(fā)頁(yè)面的PostBack,那先來(lái)看一下這個(gè)函數(shù)的定義吧:
[復(fù) 制此代碼]CODE:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
通過(guò)上面的代碼可以看到,__doPostBack帶有兩個(gè)參數(shù),eventTarget是標(biāo)識(shí)將要引發(fā)頁(yè)面 PostBack的控件ID,eventArgument參數(shù)提供了在引發(fā)頁(yè)面PostBack事件時(shí)所帶的額外參數(shù)。當(dāng)然這個(gè)函數(shù)被函數(shù)時(shí),這兩個(gè)參數(shù) 的值將賦值給頁(yè)面的兩個(gè)隱含變量__EVENTTARGET和__EVENTARGUMENT,然后調(diào)用頁(yè)面的submit方法提交頁(yè)面表單。這就是為什 么我們可以通過(guò)Request.Form[“__EVENTTARGET”]獲取得到引發(fā)頁(yè)面PostBack的控件ID的原因。
了解了 __doPostBack函數(shù)后,我們可以很容易的利用它非常方便地自己觸發(fā)自定義的PostBack事件。那上面也說(shuō)了,大部分的控件都是調(diào)用這個(gè)方法 來(lái)引了頁(yè)面的PostBack,只有兩個(gè)控件是例外,Button 和 ImageButton,正是因?yàn)樗鼈儾皇峭ㄟ^(guò)調(diào)用__doPostBack來(lái)回發(fā)事件,所以通過(guò)表單隱含變量__EVENTTARGET和 __EVENTARGUMENT是無(wú)法獲取得到引發(fā)PostBack的Button或ImageButton的ID和參數(shù)值的,只有通過(guò)下面的方式才能得 它們的實(shí)例,進(jìn)而判斷是哪個(gè)控件引發(fā)的PostBack的: C#
[復(fù)制此代碼]CODE:
foreach (string str in Request.Form)
{
Control c = Page.FindControl(str);
if (c is Button)
{
control = c;
break;
}
}
為什么能通過(guò)枚舉Request.Form集合的Key值,查找到的回發(fā)事件源呢?在這里Button和ImageButton又有一些不同。 Button控件引發(fā)的PostBack,會(huì)將Button本身的ID作為Request.Form的一個(gè)Key,它的Value是Button的 Text屬性值,回傳給服務(wù)器,這樣服務(wù)器就可以通過(guò)枚舉Request.Form的Key值,去查找出控件實(shí)例,判斷是否為Button控件,進(jìn)而得到 是哪個(gè)控件引發(fā)的PostBack事件。而ImageButton的不同就在于,它不僅僅是用ImageButton的ID作為Request.Form 的Key,它是用ImageButton的ID加上.x和.y,作為Key,在Request.Form添加兩上鍵值對(duì),這兩個(gè)鍵值對(duì)的值應(yīng)該是標(biāo)識(shí) ImageButton的圖片大小。同樣的,了解了這個(gè)規(guī)律后,我們?nèi)匀豢梢酝ㄟ^(guò)一定的方式得到是否是由ImageButton引發(fā)的PostBack。
總結(jié):理解并掌握__doPostBack原理對(duì)我們更加了解Page的事件模型有非常大的幫助,并且也是我們進(jìn)一步利用好頁(yè)面的 PostBack事件的一個(gè)重要基礎(chǔ)。在整個(gè)asp.net頁(yè)面PostBack模型中,只有Button和ImageButton是個(gè)例外,其它的控件 都是一樣的,也就是使用__doPostBack函數(shù)。在當(dāng)我們需要通過(guò)__EVENTTARGET取得到事件源控件的話,這點(diǎn)是特別要注意的。
轉(zhuǎn)載于:https://www.cnblogs.com/yangtongnet/archive/2011/02/12/1952875.html
總結(jié)
以上是生活随笔為你收集整理的Asp.net中服务端控件事件是如何触发的(笔记)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 银行卡怎么解冻账户
- 下一篇: SugarCRM 在Html中增加超连接