1. 程式人生 > >總結一下Page_Load和OnLoad

總結一下Page_Load和OnLoad

原始出處

首先Page_Load是一個方法,OnLoad也是一個方法。

OnLoad是Page類繼承自System.Web.UI.TemplateControl,而System.Web.UI.TemplateControl又繼承自System.Web.UI.Control。所以嚴格說來OnLoad是屬於System.Web.UI.Control的一個方法。

同樣Page也有一個Load事件也是相同的繼承自System.Web.UI.Control。

這裡要引入一個@ Page指令中的 AutoEventWireup。當AutoEventWireup=true的時候,頁面會與某些特殊的事件方法繫結,自動識別這些具有特定名稱的事件。這些特定名稱包括:Page_Init, Page_Load, Page_DataBind, Page_PreRender和Page_Unload等。

當true,asp.net不需要顯示的來繫結事件處理程式,它會在執行時自動的根據他們的方法名和簽名繫結事件,對每一個事件,ASP.NET會根據Page_eventname這種模式去搜尋方法,如果沒有找到帶此簽名的事件處理程式,則 ASP.NET 將檢查沒有引數的過載。當時false的時候,則必須顯示繫結事件方法,比如,你有一個Page_Load方法,只有當你這樣寫程式碼的時候,才會觸發事件方法:Page.Load += Page_Load;在這種情況下,方法名稱不必遵循某一模式。考慮效能的時候,則不要將 AutoEventWireup 設定為 true。 在啟用自動事件連線時,ASP.NET 必須進行 15 到 30 次嘗試,使將事件與方法匹配。

Page的Load事件,準確的說是System.Web.UI.Control的Load事件繫結的是System.Web.UI.Control的OnLoad方法。因此如果在Page頁面裡重寫了OnLoad方法,則此時雖然是用的AutoEventWireup=true,但Page_Load方法也不會被執行。

因此,如果比較考慮效能,建議用override Oneventname方法的方式來實現頁面的事件載入。

System.Web.UI.Control類中有如下幾個方法可供override

 protected internal virtual void OnInit(EventArgs e);

 protected internal virtual void OnLoad(EventArgs e);

 protected internal virtual void OnPreRender(EventArgs e);

 protected internal virtual void OnUnload(EventArgs e);

可以如下覆蓋

 protected override void OnLoad(EventArgs e)

    {

        Response.Write("OnLoad<br>");

    }