深入理解asp.net中的 __doPostBack函數

來源:互聯網
上載者:User

標籤:傳統型程式開發   str   架構   tor   想去   font   key   bre   style   

  前段時間做一個.net網站的時候,用到了類比前端按鈕重新整理updatePanel進行局部重新整理的時候,遇見了這個問題,當時沒顧上記下來,查看網上資料,記下來留著以後查看.

  很早以前,當我剛接觸asp.NET開發時,我曾有很多很多的疑問(大概是因為我以前一直做jsp開發,也接觸過一段時間的asp,腦海中沒有這種基於“控制項編程”和“事件編程“模型的緣故吧。當然,如果對於一個長期從事傳統型程式開發的人,轉型做asp.net--webform當然很輕鬆。)。當我面對這些功能強大的控制項,這些屬性,這些事件...我常常想知道,她裡面到底是如何?的?例如:Button按鈕是如何提交表單的?為啥我在後台可以輕鬆取到前台頁面使用者輸入的值?如何得到引起頁面PostBack的控制項?通過閱讀Page類的源碼(通過閱讀源碼以及對物件導向思想逐漸的理解,我後來慢慢體會到,其實整個.NET架構,就是按照物件導向的思想去設計的。所以我常用Reflector工具去查看源碼,探尋究竟),誤打誤撞,無意中看到了__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,那先來看一下這個函數的定義吧:

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帶有兩個參數,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的:

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值,尋找到的回傳事件來源呢?在這裡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取得到事件來源控制項的話,這點是特別要注意的。

深入理解asp.net中的 __doPostBack函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.