淺談ASP.NET內部機制(三)

來源:互聯網
上載者:User

                                             淺談ASP.NET內部機制(三)

     前言:當我們把頁面中的資料包含在表單中發送到伺服器的時候,資料到底是以什麼形式發送的?伺服器接受到提交的資料後是如何讀取這些資料,又是如何要決定來引發事件的?我們怎麼樣才能讓我們自訂的控制項能夠在伺服器端觸發事件?為什麼伺服器控制項有的要實IPostBackEventHandler,IPostBackDataHandler?.....

 

系列文章連結:

淺談ASP.NET的內部機制(一)

淺談ASP.NET的內部機制(二)

淺談ASP.NET內部機制(三)

淺談ASP.NET內部機制(四)

淺談ASP.NET內部機制(五)

淺談ASP.NET內部機制(六)

淺談ASP.NET內部機制(七)

淺談ASP.NET內部機制(八)

     大家已經在知道,在我們開發ASP.NET網站的時候,每個伺服器控制項都有自己的ID。為了後面更好的展開,下面我們就來簡單的看看這個情境:當我們在瀏覽器中點擊了一個伺服器控制項,如 Button,此時頁面回傳給伺服器,然後伺服器就引發控制項的Click等事件,這個情境是簡單的不能在簡單了。我們來進一步看,我們知道,不是所有的控制項都會在伺服器端觸發事件的,比如 submit按鈕,這個按鈕也同樣可以把表單資料傳到伺服器,但是這個控制項不能在伺服器端觸發事件。其實在一個頁面提交到了伺服器之後,伺服器就會檢查是哪個控制項引起了頁面提交,然後就把這個控制項的ID找到,然後再在我們請求的那個頁面,如Default.aspx (假設我們點擊按鈕,請求的是Default.aspx),去找是否有伺服器控制項的ID和此時提交頁面的ID是一樣的,如果有,那麼就在頁面的生命週期的合適的時候,引發事件,在把處理的結果返回;如果沒有,伺服器就不做什麼了特別的處理。

 

     還有一點要注意的是,在尋找那個控制項的ID 的時候,頁面(如Default.aspx),已經被編譯成為了一個繼承自Page的類

     當然,上面說的只是一個很粗略額過程,希望大家有個總體的認識。下面就細緻的講解。

 

     我通過一個流程來解釋:

     1.我們首先請求一個伺服器端的頁面,如:http://localhost/Demo/Default.aspx。為了方便解釋,假設頁面只有三個伺服器控制項:TextBox,DropDowmList,Button

     定義如下:

     

 

<%@ Page Language=”C#” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title>Untitled Page</title>
</head>
<body>
<form id=”form1” runat=”server”>
     <asp:TextBox runat=”server” ID=”TextBox1” />

     <asp:DropDownList runat=”server” ID=”DropDownList1”>
     <asp:ListItem Text=”Text1” Value=”Value1” />
     <asp:ListItem Text=”Text2” Value=”Value2” />
     <asp:ListItem Text=”Text3” Value=”Value3” />
     </asp:DropDownList>

     <asp:Button runat=”server” Text=”Submit” />
</form>
</body>
</html>

 

     在瀏覽器中,我們在”源“中,看到的如下:

     

 

 

Code
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title>Untitled Page </title>
</head>
<body>
<form name=”form1” method=”post” action=”Default7.aspx” id=”form2”>
<div>
<input type=”hidden” name=”__VIEWSTATE” id=”__VIEWSTATE”
value=”/wEPDwUKMTAxNzk2MjY2OWRkxj+0HeO0c5N0xVutp03x6OdaSpw=” />
</div>
<input name=”TextBox1” type=”text” id=”TextBox1” />
<select name=”DropDownList1” id=”DropDownList1”>
<option value=”Value1”>Text1</option>
<option value=”Value2”>Text2</option>
<option value=”Value3”>Text3</option>
</select>
<input type=”submit” name=”ctl02” value=”Submit” />
</form>
</body>
</html>

 

 

     確實,上面的那些HTML的代碼確實沒有什麼,但是大家注意看看TextBox,DropDownList,它們的ID在伺服器端的aspx頁面和本地的源中的ID是一樣的。

     2.我們在瀏覽器中的TextBox中輸入"xiaoyang",然後DropDowList 選中"Text2",然後我們點擊按鈕,提交。此時我們提交的資料被包含在表單中的,而且是以這樣的格式儲存的"TextBox1=xiaoyang&DropDownList1=Value2",不用多說,表單資料是用"&"來分隔的,而且每個分隔的串包含兩個部分:ID和值,也就是"索引值對"。

     3.資料到了伺服器後,ASP.NET就執行個體化一個 HttpRequest的類,這個類有兩個屬性 Forms和 QueryString,它們的類型都是NameValueCollection(索引值對,大家可以把它看成一個HashTable),然後ASP.NET解析表單資料,表單資料就解析成為了一個個的索引值對,然後就儲存在Forms(POST提交)或者QueryString中(GET提交)。我們之前是以POST提交為例子的。

     4.之前的事情是發生在頁面的生命週期之前的。當頁面調用自己的ProcessRequest方法後,就進入了頁面生命週期,此時頁面就會檢查頁面中的所有控制項,看看它們有哪些實現了IPostBackDataHandler介面,然後把實現了這些介面的控制項都放入到一個ArrayList中,然後也檢查哪些控制項實現了IPostBackEventHandler,也把它們假如到另外的集合中,之後就開發遍曆實現了IPostBackDataHandler控制項的集合,並且調用IPostBackDataHandler的方法:LoadPostData(string postdatakey,NameValueCollection value)。

     之前說過了的,我們提交的表單的值都儲存在了Forms中(它的類型是NameValueCollection 的),所以此時這些值就傳入到了這個方法,然後就檢查這些值和之前的是不是相同的,我們已經還記得,我們在瀏覽器中看到頁面時,頁面中的TextBox 初始時是沒有值的,而且DropDownList選擇的是Text2,現在我們的值改了,是“xiaoyang"和"Text2".所以這個方法檢查的結果是:值變了,返回了true.只要返回了true,那麼IPostBackDataHandler的下一個方法就會調用RaisePostDataChangeEvent();這個方法已經註冊了事件,到頁面生命週期的之後就後引發的。

     5.所以,如果我們開發的自訂控制項想要在資料改變的時候引發事件,那麼就一定要實現IPostBackDataHandler介面。例子可以參看我的另外的控制項開發的系列文章。

     6.現在我們已經說到了資料的改變。下面就看看到底是怎麼引發事件的。到了頁面開發執行RaisePostbackEvent方法的時候,頁面就會遍曆實現了IPostBackEventHandler的控制項的集合,並且檢查是否在頁面中存在一個控制項:這個控制項要實現了IPostBackEventHandler,並且ID和之前使得頁面提交到伺服器的的那個控制項的ID一樣。如果有IPostBackEventHandler的RaisePostBackEvent 方法來觸發事件(不同控制項實現這個方法的方式不同),如Click事件。

     所以,如果想在自訂控制項可以觸發事件,那麼就要實現IPostBackEventHandler介面。可以參看我的控制項開發系列文章,有例子的。

 

     今天到這裡!謝謝大家。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.