深入理解asp.net中的 __doPostBack函数
前段時間做一個.net網(wǎng)站的時候,用到了模擬前端按鈕刷新updatePanel進行局部刷新的時候,遇見了這個問題,當時沒顧上記下來,查看網(wǎng)上資料,記下來留著以后查看.
很早以前,當我剛接觸asp.NET開發(fā)時,我曾有很多很多的疑問(大概是因為我以前一直做jsp開發(fā),也接觸過一段時間的asp,腦海中沒有這種基于“控件編程”和“事件編程“模型的緣故吧。當然,如果對于一個長期從事桌面程序開發(fā)的人,轉(zhuǎn)型做asp.net--webform當然很輕松。)。當我面對這些功能強大的控件,這些屬性,這些事件...我常常想知道,她里面到底是如何實現(xiàn)的?例如:Button按鈕是如何提交表單的?為啥我在后臺可以輕松取到前臺頁面用戶輸入的值?如何得到引起頁面PostBack的控件?通過閱讀Page類的源碼(通過閱讀源碼以及對面向?qū)ο笏枷胫饾u的理解,我后來慢慢體會到,其實整個.NET框架,就是按照面向?qū)ο蟮乃枷肴ピO(shè)計的。所以我常用Reflector工具去查看源碼,探尋究竟),誤打誤撞,無意中看到了__EVENTTARGET和__EVENTARGUMENT這兩個常量的定義,并通過調(diào)試分析頁面,知道了通過Request.Form[“__EVENTTARGET”]可以獲取到觸發(fā)頁面PostBack的事件源(控件的ID)。對于一般的控件,這樣就可以了,唯有Button和ImageButton觸發(fā)的PostBack無法通過這種方式獲取到它們的ID,起初還以為是它們實現(xiàn)的接口的不同而產(chǎn)生PostBack方式的不同。剛剛在AspAlliance.看到一篇關(guān)于__doPostBack的文章(原文:《Understanding the JavaScript __doPostBack Function》),才真正明白了頁面PostBack的內(nèi)在機制,疑團也終于解開了。下面來簡單看一下頁面PostBack的原理,和Button,ImageButton PostBack的特殊性。
???__doPostBack是一個純粹并且是非常簡單的JavaScript函數(shù),大部分的頁面PostBack都是由它觸發(fā)的。注意,這里是“大部分”,因為只有兩個Web Server Control????會自己觸發(fā)頁面的PostBack,其它的所以控件都是通過__doPostBack函數(shù)觸發(fā)頁面的PostBack,那先來看一下這個函數(shù)的定義吧:
1 <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> 2 <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> 3 function __doPostBack(eventTarget, eventArgument) { 4 if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 5 theForm.__EVENTTARGET.value = eventTarget; 6 theForm.__EVENTARGUMENT.value = eventArgument; 7 theForm.submit(); 8 } 9 }rm.submit();?
通過上面的代碼可以看到,__doPostBack帶有兩個參數(shù),eventTarget是標識將要引發(fā)頁面PostBack的控件ID,eventArgument參數(shù)提供了在引發(fā)頁面PostBack事件時所帶的額外參數(shù)。當然這個函數(shù)被函數(shù)時,這兩個參數(shù)的值將賦值給頁面的兩個隱含變量__EVENTTARGET和__EVENTARGUMENT,然后調(diào)用頁面的submit方法提交頁面表單。這就是為什么我們可以通過Request.Form[“__EVENTTARGET”]獲取得到引發(fā)頁面PostBack的控件ID的原因。
???了解了__doPostBack函數(shù)后,我們可以很容易的利用它非常方便地自己觸發(fā)自定義的PostBack事件。那上面也說了,大部分的控件都是調(diào)用這個方法來引了頁面的PostBack,只有兩個控件是例外,Button 和 ImageButton,正是因為它們不是通過調(diào)用__doPostBack來回發(fā)事件,所以通過表單隱含變量__EVENTTARGET和__EVENTARGUMENT是無法獲取得到引發(fā)PostBack的Button或ImageButton的ID和參數(shù)值的,只有通過下面的方式才能得它們的實例,進而判斷是哪個控件引發(fā)的PostBack的:
1 foreach (string str in Request.Form){ 2 Control c = Page.FindControl(str); 3 if (c is Button){ 4 control = c; 5 break; 6 } 7 }為什么能通過枚舉Request.Form集合的Key值,查找到的回發(fā)事件源呢?在這里Button和ImageButton又有一些不同。Button控件引發(fā)的PostBack,會將Button本身的ID作為Request.Form的一個Key,它的Value是Button的Text屬性值,回傳給服務(wù)器,這樣服務(wù)器就可以通過枚舉Request.Form的Key值,去查找出控件實例,判斷是否為Button控件,進而得到是哪個控件引發(fā)的PostBack事件。而ImageButton的不同就在于,它不僅僅是用ImageButton的ID作為Request.Form的Key,它是用ImageButton的ID加上.x和.y,作為Key,在Request.Form添加兩上鍵值對,這兩個鍵值對的值應(yīng)該是標識ImageButton的圖片大小。同樣的,了解了這個規(guī)律后,我們?nèi)匀豢梢酝ㄟ^一定的方式得到是否是由ImageButton引發(fā)的PostBack。
總結(jié):理解并掌握__doPostBack原理對我們更加了解Page的事件模型有非常大的幫助,并且也是我們進一步利用好頁面的PostBack事件的一個重要基礎(chǔ)。在整個asp.Net頁面PostBack模型中,只有Button和ImageButton是個例外,其它的控件都是一樣的,也就是使用__doPostBack函數(shù)。在當我們需要通過__EVENTTARGET取得到事件源控件的話,這點是特別要注意的。
轉(zhuǎn)載于:https://www.cnblogs.com/xujingyang/p/7074510.html
總結(jié)
以上是生活随笔為你收集整理的深入理解asp.net中的 __doPostBack函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: symfony学习笔记——路由
- 下一篇: 【行为型模式】《大话设计模式》——读后感