ASP.NET頁面如何引發PostBack事件

來源:互聯網
上載者:User

使用者在ASP.NET應用程式顯示的頁面上面點擊一個Button、LinkButton、或者改變某個TextBox的Value時(啟用AotuPostBack),就會導致頁面提交,並且在伺服器端引發對應的PostBack事件,大家可以想象用戶端瀏覽器顯示的是html,而html是不存在引發PostBack事件這一說的,這樣就說明ASP.NET應用程式肯定提供一種方法,能夠知道使用者在用戶端做了什麼動作導致頁面被提交的,然後伺服器端根據這個資訊引發相應的伺服器端控制項的PostBack事件,那麼這篇文章,我們一起來討論下ASP.NET應用程式是如何來引發PostBack事件.

首先我們通過最直接的方式來查看ASP.NET Page 根據什麼資訊來引發對應控制項的PostBack事件的,我們知道 頁面繼承與 Page類,伺服器端接受到一個頁面請求時,伺服器端會按預期的進行一系列的處理,這個就是Page 頁面的生命週期,在這裡我們就不討論這個內容的,因為已經有很多文章介紹Page生命週期的內容的,這裡我們只關注Page類型中RaisePostBackEvent方法裡面的邏輯,我們通過Reflector查看 Page類型的RaisePostBackEvent方法.

 private void RaisePostBackEvent (NameValueCollection postData)
{
    if (this._registeredControlThatRequireRaiseEvent != null)
    {
        this.RaisePostBackEvent(this._registeredControlThatRequireRaiseEvent, null);
    }
    else
    {
        string str = postData["__EVENTTARGET"];
        bool flag = !string.IsNullOrEmpty(str);
        if (flag || (this.AutoPostBackControl != null))
        {
            Control control = null;
            if (flag)
            {
                control = this.FindControl(str);
            }
            if ((control != null) && (control.PostBackEventHandler != null))
            {
                string eventArgument = postData["__EVENTARGUMENT"];
                this.RaisePostBackEvent(control.PostBackEventHandler, eventArgument);
            }
        }
        else
        {
             this.Validate();
        }
    }
}


這段代碼做這樣幾件事情,首先判斷是否頁面上有某個控制項註冊引發PostBack事件,通常通過Page.RegisterRequiresPostBack(Control control)方法來註冊的,如果沒有控制項註冊引發PostBack事件,那麼就會查看回傳頁面的post資料中是否包含這樣2個索引值對,__EVENTTARGET 和 __EVENTARGUMENT,如果__EVENTTARGET鍵包含值,那麼通過Page.FindControl找到控制項的引用並查看該控制項PostBackEventHandler是否為空白,不為空白那麼就引發這個控制項的PostBackEvent,這個就是ASP.NET如何引發頁面回傳事件的邏輯啦.

對於第一種方式在伺服器端為某個控制項註冊需要引發回傳事件,這通常是在我們開發的完全定製自訂控制項中需要使用的(完全定製也就是不組合已有的伺服器端控制項),通過在自訂的控制項中實現IPostBackEventHandler 和 IPostBackDataHandler 介面, IPostBackDataHandler介面需實現2個方法 bool LoadPostData(string postDataKey, NameValueCollection postCollection) 和 void RaisePostDataChangedEvent().我們需要在LoadPostData 方法中判斷回傳資料是否包含你想要的資訊(頁面提交會將form中的資訊以key-value的形式提交到伺服器,在這裡我們只需要判斷key-value集合中是否包含對應控制項的Name屬性即可),如果包含我們想要的資訊,那麼就說明是我們自訂的控制項引發的回傳,這樣則可將這個控制項註冊為需要引發回傳事件.

對於第二種方式,比如像LinkButton控制項,其呈現時產生的Html代碼不是<input type="submit"/>,因此他本身是不具備提交頁面的功能,因此用戶端必須通過JavaScript來實現頁面提交,但是由於LinkButton呈現的html代碼是<a>標籤,頁面提交時並不會將<a>標籤key-value進行打包,所以頁面提交後,伺服器端無法找到到底是誰引發的頁面回傳,因此ASP.NET提供2個Hidden Input標籤.

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />

這2個東東相信大家經常看到,當你點擊LinkButton時,用戶端會通過JavaScript將被點擊的LinkButton的Name和對應的參數儲存在這2個hidden input中,然後提交頁面,頁面會將這2個hidden input 打包,以key-value的形式傳回到伺服器端,伺服器端就可以通過  postData["__EVENTTARGET"] 來擷取究竟是什麼引發頁面回傳,進而找到其對應的服務端控制項並觸發其回傳事件.

以上就是Web Form引發回傳事件的內幕啦,本開始準備寫幾個例子來一一講述,便於與大家交流,但是寫個簡單自訂控制項要敲蠻多代碼,本人比較懶,所以只好全部用文字來講述啦,如果有表達不清楚的地方,請見諒.

相關關鍵詞:
相關文章

聯繫我們

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