日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转]深入理解 __doPostBack

發布時間:2025/4/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]深入理解 __doPostBack 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??在我的隨筆《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,那先來看一下這個函數的定義吧:

CODE1:

<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是標識將要引發頁面PostBack的控件ID,eventArgument參數提供了在引發頁面PostBack事件時所帶的額外參數。當然這個函數被函數時,這兩個參數的值將賦值給頁面的兩個隱含變量__EVENTTARGET和__EVENTARGUMENT,然后調用頁面的submit方法提交頁面表單。這就是為什么我們可以通過Request.Form[“__EVENTTARGET”]獲取得到引發頁面PostBack的控件ID的原因。

???了解了__doPostBack函數后,我們可以很容易的利用它非常方便地自己觸發自定義的PostBack事件。那上面也說了,大部分的控件都是調用這個方法來引了頁面的PostBack,只有兩個控件是例外,Button 和 ImageButton,正是因為它們不是通過調用__doPostBack來回發事件,所以通過表單隱含變量__EVENTTARGET和__EVENTARGUMENT是無法獲取得到引發PostBack的Button或ImageButton的ID和參數值的,只有通過下面的方式才能得它們的實例,進而判斷是哪個控件引發的PostBack的:

CODE2:

foreach (string str in Request.Form)

????{

????Control c = Page.FindControl(str);

if (c is Button)

{

control = c;

break;

}

}

???為什么能通過枚舉Request.Form集合的Key值,查找到的回發事件源呢?在這里Button和ImageButton又有一些不同。Button控件引發的PostBack,會將Button本身的ID作為Request.Form的一個Key,它的Value是Button的Text屬性值,回傳給服務器,這樣服務器就可以通過枚舉Request.Form的Key值,去查找出控件實例,判斷是否為Button控件,進而得到是哪個控件引發的PostBack事件。而ImageButton的不同就在于,它不僅僅是用ImageButton的ID作為Request.Form的Key,它是用ImageButton的ID加上.x和.y,作為Key,在Request.Form添加兩上鍵值對,這兩個鍵值對的值應該是標識ImageButton的圖片大小。同樣的,了解了這個規律后,我們仍然可以通過一定的方式得到是否是由ImageButton引發的PostBack。

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

LookIntoDoPostBack.zip

?

轉載于:https://www.cnblogs.com/csuwhl/archive/2006/09/08/499158.html

總結

以上是生活随笔為你收集整理的[转]深入理解 __doPostBack的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。