__doPostBack 方法解析


function __doPostBack(eventTarget, eventArgument)的eventTarget參數是引起回送的控件的ID,eventArgument參數是回調參數(與控件相關的附加數據)。

當如果是刪除時,eventArgument參數是Delete開頭;當如果是插入時,eventArgument參數是Insert開頭;當如果是編輯時,eventArgument參數是Edit開頭;當如果是選擇時,eventArgument參數是Select開頭。 

客戶端觸發事件后調用__doPostBack方法,將表示觸發的控件源的eventTarget和事件參數eventArgument分別付給兩個隱藏域__EVENTTARGET和__EVENTARGUMENT,然后提交Form,在服務端根據__EVENTTARGET和__EVENTARGUMENT來判斷是哪個控件的什么事件觸發了。

 

只有兩個Web Server Control會自己觸發頁面的PostBack, 其它的所有控件都是通過__doPostBack函數觸發頁面的PostBack,頁面解析時回將該類生成一個__doPostBack(eventTarget, eventArgument)方法。這兩個參數分別由隱藏的兩個表單域__ EVENTTARGET和__ EVENTARGUMENT保存。使用這兩個隱藏的表單可以查找引起頁面回送的控件ID和回送時的參數。然后就可以在后台用Request.Form["__EVENTTARGET"]和Request.Form["__EVENTARGUMENT"]取得控件ID和參數。當你觸發__doPostBack事件時,遍歷this.Request.Form.AllKeys,你查看到這兩個隱藏的表單。

 

__VIEWSTATE:頁面狀態信息在客戶端的存儲(ViewState中存儲的信息, EnableViewState="true"的控件狀態信息).
__EVENTTARGET:頁面回傳觸發事件 頁面回傳觸發事件:

__doPostBack('Button2','')表示調用按鈕Button2在后端的所對應的單擊事件控件回傳觸發事件:

__doPostBack('TEST1$Button1','')表示調用TEST1控件中的Button1按鈕的Click方法
__EVENTARGUMENT:頁面回傳觸發事件時所帶的參數 如:__doPostBack('Button1','aa')在后端可以使用Request.Form["__EVENTARGUMENT"]來取得
.net自動生成的一些客戶端的代碼用來回傳數據和自己帶的一些腳本函數。

 

Asp.net的postback機制我們知道Asp.net輸出到客戶端時都會被轉化為HTML,頁面Render到Client后,Client的HTML代碼將包含如下代碼:

 1 <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
 2 
 3  <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
 4 
 5  <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTA0NDQ2OTE5OWRk281L4eAk7iZT10hzg+BeOyoUWBQ=" />
 6 
 7  <script type="text/javascript">
 8 
 9  var theForm = document.forms['form1']; 10  if (!theForm) 11 
12  { 13 
14     theForm = document.form1; 15 
16  } 17 
18 
19  function __doPostBack(eventTarget, eventArgument) 20 
21  { 22 
23  if (!theForm.onsubmit || (theForm.onsubmit() != false)) 24 
25  { 26 
27   theForm.__EVENTTARGET.value = eventTarget; 28 
29   theForm.__EVENTARGUMENT.value = eventArgument; 30 
31  theForm.submit(); 32 
33  } 34 
35  } 36 </script>

其中隱藏字段_EVENTTARGET代表觸發事件的控件。_EVENTARGUMENT代表事件的額外參數。為了頁面能在PostBack后依然能讀取服務器控件原有的狀態數據,Asp.net中使用了ViewState技術,而ViewState技術本質上是用一個默認名稱為__VIEWSTATE的Hidden類型表單域來保存和傳遞數據(這些數據是經過了序列化后Base64編碼的字符串值)。控件的事件被Render后事件變成javascript:__doPostBack('Button1','')

例如下面的樣子

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

不過,另外要注意的就是asp.net的webcontrols中,Button和ImgButton是異類,它們不是利用__doPostBack來實現postback的。為什么這樣,可能因為Button在html中本來就是有觸發submit事件的功能吧。asp.net不過是要令原來html中一些不能觸發submit的東西submit,才弄出了__doPostBack來實現。對於原來就能submit的Button,又何必多此一舉呢。

如上寫法可以在后台找到Button。為什么這樣? 不知道, 在Button的提交過程中,Button會將Button本身的ID作為Request.Form的一個Key,它的Value是Button的Text屬性值,回傳給服務器。所以可以在后台循環Form.Keys取到所提交的Button,以執行相應的函數.ImgButton也差不多,不同就在於,它不是用ImageButton的ID作為Request.Form的Key,它是用ImageButton的ID加上.x和.y作為Key,在Request.Form添加兩上鍵值對,這兩個鍵值應該是對應ImageButton的圖片大小的,了解了這個規律后,我們仍然可以通過一定的方式得到是否是由ImageButton引發的PostBack。

 

例子:

下拉列表觸發PostBack

在 index.aspx 文件:

1 狀態:<asp:DropDownList ID="Ddl_Status" runat="server" AutoPostBack="true" onselectedindexchanged="Ddl_Status_SelectedIndexChanged">
2      <asp:ListItem></asp:ListItem>
3      <asp:ListItem Value="派工中">派工中</asp:ListItem>
4      <asp:ListItem Value="已完成">已完成</asp:ListItem>
5      </asp:DropDownList></td></tr>
 1 <script type="text/javascript">
 2 var theForm = document.forms['form1'];  3 if (!theForm) {  4     theForm = document.form1;  5 }  6 function __doPostBack(eventTarget, eventArgument) {  7     if (!theForm.onsubmit || (theForm.onsubmit() != false)) {  8         theForm.__EVENTTARGET.value = eventTarget;  9         theForm.__EVENTARGUMENT.value = eventArgument; 10  theForm.submit(); 11  } 12 } 13 </script>

 在 index.aspx.cs 文件:

1  protected void Ddl_Status_SelectedIndexChanged(object sender, EventArgs e) 2  { 3     PG_DataBind();  //自定義的調用方法
4  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM