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