中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

深入理解__doPostBack 客戶端調用服務端事件

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

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

了解了__doPostBack函數后,我們可以很容易的利用它非常方便地自己觸發(fā)自定義的PostBack事件。那上面也說了,大部分的控件都是調用這個方法來引了頁面的PostBack,只有兩個控件是例外,Button 和 ImageButton,正是因為它們不是通過調用__doPostBack來回發(fā)事件,所以通過表單隱含變量__EVENTTARGET和__EVENTARGUMENT是無法獲取得到引發(fā)PostBack的Button或ImageButton的ID和參數值的,只有通過下面的方式才能得它們的實例,進而判斷是哪個控件引發(fā)的PostBack的: C#
復制代碼 代碼如下:
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,會將Button本身的ID作為Request.Form的一個Key,它的Value是Button的Text屬性值,回傳給服務器,這樣服務器就可以通過枚舉Request.Form的Key值,去查找出控件實例,判斷是否為Button控件,進而得到是哪個控件引發(fā)的PostBack事件。而ImageButton的不同就在于,它不僅僅是用ImageButton的ID作為Request.Form的Key,它是用ImageButton的ID加上.x和.y,作為Key,在Request.Form添加兩上鍵值對,這兩個鍵值對的值應該是標識ImageButton的圖片大小。同樣的,了解了這個規(guī)律后,我們仍然可以通過一定的方式得到是否是由ImageButton引發(fā)的PostBack。

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

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

AspNet技術深入理解__doPostBack 客戶端調用服務端事件,轉載需保留來源!

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

主站蜘蛛池模板: 亚洲国产第一页 | 盗摄精品av一区二区三区 | 性高朝久久久久久久3小时 av一区二区三区四区 | 亚洲五码久久 | 亚洲男人天堂 | 久久久久久av | 久久精品国产亚洲 | 中文字幕在线视频免费视频 | 国产精品成人一区二区三区夜夜夜 | 一区二区三区视频在线免费观看 | 国产成人综合网 | 中文字幕精品一区二区三区精品 | 天天天天天天操 | 国产成人午夜精品影院游乐网 | 91视频在线网站 | 国产福利一区二区 | 国产精品自拍av | 在线观看av网站 | av在线视 | 免费看爱爱视频 | 夜夜骑首页 | 一级做受毛片免费大片 | 亚洲精品乱码 | 日韩欧美在线免费 | 欧美最猛性xxxxx亚洲精品 | 99精品在线观看 | 久久一区二 | 色综合天天网 | 欧美美女爱爱视频 | 日韩激情视频一区 | 91成人免费看片 | 97成人免费 | 成人免费视屏 | 国产亚洲黄色片 | 国产精品资源在线观看 | 日韩精品成人 | 天天综合网7799精品 | 久久精品一| 先锋资源网站 | av网站免费看 | 91av国产在线视频 |