在 Page Load 之前得知 Button Click 動作

原文地址:http://www.dotblogs.com.tw/jeff377/archive/2008/03/17/1725.aspx

 

 

 

在 ASP.NET 的運行機制中,Button 的 Click 事件,一定會是 Page Load 事件之後。以下寫個簡單測試範例,在 Page Load 事件及 Button Click 事件分別 Response.Write 事件名稱,當按下按鈕時去觀查輸出的結果會發覺 Page Load 事件比 Button Click 事件先執行。

 

  1. Partial  Class  _Default  
  2.     Inherits  System.Web.UI.Page  
  3.   
  4.     Protected   Sub  Page_Load( ByVal  sender  As   ObjectByVal  e  As  System.EventArgs)  Handles   Me .Load  
  5.         Me .Response.Write( "Page_Load" )  
  6.         Me .Response.Write("  
  7. ")  
  8.     End   Sub   
  9.   
  10.     Protected   Sub  Button1_Click( ByVal  sender  As   ObjectByVal  e  As  System.EventArgs)  Handles  Button1.Click  
  11.         Me .Response.Write( "Button1_Click" )  
  12.         Me .Response.Write("  
  13. ")  
  14.     End   Sub   
  15.   
  16. End   Class   

執行結果

至於為什麼會有這樣的結果呢?因為由 PostBack 動作所引發的控制項事件,是在 Page Load 中處理,此時會去檢查 Request.Form 的回傳值,再決定要引發的控制項事件。若需要在 Page Load 之前就要知道是那個 Button Click 動作,那就要自行由 Request.Form 中去判斷那個按鈕產生的 PostBack 動作。

一般 PostBack 的都是經由網頁 HTML 原始碼的 __doPostBack 函式處理 (註:Submit Button 並不會呼叫 __doPostBack 函式),__doPostBack 函式有 eventTarget 及 eventArgument 二個引數。其中 eventTarget 是產生 PostBack 的控制項,它會將值保留在 __EVENTTARGET 這個 HiddenField 中;eventArgument 是事件引數,它會將值保留在 __EVENTARGUMENT 這個 HiddenField 中。

 

  1. <input type= "hidden"  name= "__EVENTTARGET"  id= "__EVENTTARGET"  value= ""  />  
  2. <input type="hidden"  name= "__EVENTARGUMENT"  id= "__EVENTARGUMENT"  value= ""  />  
  3.   
  4. <script type="text/javascript" >  
  5. <!--  
  6. var theForm = document.forms['form1'];   
  7. if (!theForm) {  
  8.     theForm = document.form1;  
  9. }  
  10. function __doPostBack(eventTarget, eventArgument) {  
  11.     if (!theForm.onsubmit || (theForm.onsubmit() != false)) {  
  12.         theForm.__EVENTTARGET.value = eventTarget;  
  13.         theForm.__EVENTARGUMENT.value = eventArgument;  
  14.         theForm.submit();  
  15.     }  
  16. }  
  17. // -->  
  18. </script>  

有上以上的基本認知,接下來就要實作如何在 Page Load 之前得知 Button Click 動作。首先在頁面上放置一個 Button 控制項,並將 UseSubmitBehavior 屬性設為 False。

 

  1. <asp:Button ID= "Button1"  runat= "server"  Text= "Button"  UseSubmitBehavior= "False"  />  

執行程式,查看 Button 產生的 HTML 碼,可以發現 Button 的 onclick 呼叫 __doPostBack('Button1','') 去執行 PostBack 動作,它只能使 eventTarget 引數,而 eventArgument 是傳入空字串。eventTarget 引數值是 Client 端 Button 的 id (等於 Button 控制項的 ClientID)。

 

  1. <input type= "button"  name= "Button1"  value= "Button"  οnclick= "javascript:__doPostBack('Button1','')"  id= "Button1"  />  

如果在 Page Init 事件就需要知道那個 Button Click 動作,就可以利用 __EVENTTARGET 這個 HiddenField 來判斷,若 __EVENTTARGET 等於 Button 的 ClientID 就代表是由那個 Button Click 產生的 PostBack 動作。

 

  1. Partial  Class  _Default  
  2.     Inherits  System.Web.UI.Page  
  3.   
  4.     Protected   Sub  Page_Init( ByVal  sender  As   ObjectByVal  e  As  System.EventArgs)  Handles   Me .Init  
  5.         '判斷 __EVENTTARGET HiddenField 的值,來判斷是否為 Button Click 產生的 PostBack 動作   
  6.         If   Me .Request.Form( "__EVENTTARGET" ) = Button1.ClientID  Then   
  7.             Me .Response.Write( "Page_Init 的 Button Click" )  
  8.             Me .Response.Write("  
  9. ")  
  10.         End   If   
  11.     End   Sub   
  12.   
  13.     Protected   Sub  Page_Load( ByVal  sender  As   ObjectByVal  e  As  System.EventArgs)  Handles   Me .Load  
  14.         Me .Response.Write( "Page_Load" )  
  15.         Me .Response.Write("  
  16. ")  
  17.     End   Sub   
  18.   
  19.     Protected   Sub  Button1_Click( ByVal  sender  As   ObjectByVal  e  As  System.EventArgs)  Handles  Button1.Click  
  20.         Me .Response.Write( "Button1_Click" )  
  21.         Me .Response.Write("  
  22. ")  
  23.     End   Sub   
  24.   
  25. End   Class   

執行程式,當按下按鈕的執行結果如下。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值