天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

深入理解__doPostBack 客戶端調(diào)用服務(wù)端事件

在我的隨筆《Page,你是怎樣處理回發(fā)事件的?》中曾提出一個(gè)疑問,如何得到引起頁面PostBack的控件?通過閱讀Page類的源碼,誤打誤撞,無意中看到了__EVENTTARGET和__EVENTARGUMENT這兩個(gè)常量的定義,并通過調(diào)試分析頁面,知道了通過Request.Form[“__EVENTTARGET”]可以獲取到觸發(fā)頁面PostBack的事件源(控件的ID)。對于一般的控件,這樣就可以了,唯有Button和ImageButton觸發(fā)的PostBack無法通過這種方式獲取到它們的ID,起初還以為是它們實(shí)現(xiàn)的接口的不同而產(chǎn)生PostBack方式的不同。剛剛在ASPAlliance.看到一篇關(guān)于__doPostBack的文章(原文:《Understanding the JavaScript __doPostBack Function》),才真正明白了頁面PostBack的內(nèi)在機(jī)制,疑團(tuán)也終于解開了。下面來簡單看一下頁面PostBack的原理,和Button,ImageButton PostBack的特殊性。

__doPostBack是一個(gè)純粹并且是非常簡單的Javascript函數(shù),大部分的頁面PostBack都是由它觸發(fā)的。注意,這里是“大部分”,因?yàn)橹挥袃蓚€(gè)Web Server Control 會(huì)自己觸發(fā)頁面的PostBack,其它的所以控件都是通過__doPostBack函數(shù)觸發(fā)頁面的PostBack,那先來看一下這個(gè)函數(shù)的定義吧:
復(fù)制代碼 代碼如下:
<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();
}
}
通過上面的代碼可以看到,__doPostBack帶有兩個(gè)參數(shù),eventTarget是標(biāo)識將要引發(fā)頁面PostBack的控件ID,eventArgument參數(shù)提供了在引發(fā)頁面PostBack事件時(shí)所帶的額外參數(shù)。當(dāng)然這個(gè)函數(shù)被函數(shù)時(shí),這兩個(gè)參數(shù)的值將賦值給頁面的兩個(gè)隱含變量__EVENTTARGET和__EVENTARGUMENT,然后調(diào)用頁面的submit方法提交頁面表單。這就是為什么我們可以通過Request.Form[“__EVENTTARGET”]獲取得到引發(fā)頁面PostBack的控件ID的原因。

了解了__doPostBack函數(shù)后,我們可以很容易的利用它非常方便地自己觸發(fā)自定義的PostBack事件。那上面也說了,大部分的控件都是調(diào)用這個(gè)方法來引了頁面的PostBack,只有兩個(gè)控件是例外,Button 和 ImageButton,正是因?yàn)樗鼈儾皇峭ㄟ^調(diào)用__doPostBack來回發(fā)事件,所以通過表單隱含變量__EVENTTARGET和__EVENTARGUMENT是無法獲取得到引發(fā)PostBack的Button或ImageButton的ID和參數(shù)值的,只有通過下面的方式才能得它們的實(shí)例,進(jìn)而判斷是哪個(gè)控件引發(fā)的PostBack的: C#
復(fù)制代碼 代碼如下:
foreach (string str in Request.Form)
{
Control c = Page.FindControl(str);
if (c is Button)
{
control = c;
break;
}
}

為什么能通過枚舉Request.Form集合的Key值,查找到的回發(fā)事件源呢?在這里Button和ImageButton又有一些不同。Button控件引發(fā)的PostBack,會(huì)將Button本身的ID作為Request.Form的一個(gè)Key,它的Value是Button的Text屬性值,回傳給服務(wù)器,這樣服務(wù)器就可以通過枚舉Request.Form的Key值,去查找出控件實(shí)例,判斷是否為Button控件,進(jìn)而得到是哪個(gè)控件引發(fā)的PostBack事件。而ImageButton的不同就在于,它不僅僅是用ImageButton的ID作為Request.Form的Key,它是用ImageButton的ID加上.x和.y,作為Key,在Request.Form添加兩上鍵值對,這兩個(gè)鍵值對的值應(yīng)該是標(biāo)識ImageButton的圖片大小。同樣的,了解了這個(gè)規(guī)律后,我們?nèi)匀豢梢酝ㄟ^一定的方式得到是否是由ImageButton引發(fā)的PostBack。

總結(jié):理解并掌握__doPostBack原理對我們更加了解Page的事件模型有非常大的幫助,并且也是我們進(jìn)一步利用好頁面的PostBack事件的一個(gè)重要基礎(chǔ)。在整個(gè)ASP.NET頁面PostBack模型中,只有Button和ImageButton是個(gè)例外,其它的控件都是一樣的,也就是使用__doPostBack函數(shù)。在當(dāng)我們需要通過__EVENTTARGET取得到事件源控件的話,這點(diǎn)是特別要注意的。

注意: __doPostBack('','')前面是兩個(gè)“_”,不是一個(gè)。

AspNet技術(shù)深入理解__doPostBack 客戶端調(diào)用服務(wù)端事件,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 97精品视频在线观看 | 国产日韩久久久精品影院首页 | 日本十八禁无遮拦啪啪漫画 | 99久久婷婷国产麻豆精品电影 | 野花日本大全免费高清完整版 | 麻花传媒XK在线观看 | 欧美videosgratis杂交 | 亚洲成人99 | 国产精品久久久久永久免费看 | 色列少女漫画 | 日韩人妻双飞无码精品久久 | 久久精品视在线观看85 | 琪琪色原网20岁以下热热色原网站 | 99re久久热在这里精品 | 理论片午午伦夜理片影院 | 黑吊大战白xxxxxx | 国产精品一区二区激情 | 亚洲精品视频观看 | 麻豆影视在线直播观看免费 | 亚洲国产AV一区二区三区四区 | 一本之道高清在线观看免费 | 19十主播福利视频 | 好满射太多了装不下了视频 | 小夫妻天天恶战 | 亚洲视频第二页 | 99久久国产露脸精品国产麻豆 | 成 人 片 免费播放 成 人 免费 黄 色 网站无毒下载 | 羞羞影院午夜男女爽爽免费 | 国产精品免费一区二区区 | 日本十八禁无遮无挡漫画 | 亚洲国产精品无码中文字满 | 性绞姿始动作动态图 | 亚洲欧美中文字幕先锋 | 久久亚洲这里只有精品18 | 国产精一品亚洲二区在线播放 | 亚洲精品九色在线网站 | 中文字幕在线视频在线看 | 久久综久久美利坚合众国 | 日日夜夜撸 在线影院 | 国产精品青青在线麻豆 | 国模孕妇模特季玥之粉红 |