2009-09-29 70 views
18

Page_Load不是一種虛擬方法。什麼叫這種方法,它是如何做到的?它是反射還是其他技術?還有多少事件以這種方式處理?什麼是Page_Load,它是如何做的?

也是最好處理重載的OnLoad或Page_Load中的東西?他們有什麼不同?

回答

21

ASP.NET有一個名爲「AutoEventWireup」的功能 - 此功能允許您創建具有EventHandler簽名的方法,其名稱爲Page_Load,並且運行時會將事件從父頁連接到類中的方法。基本上運行時確實這代表您:

this.Load += this.Page_Load; 

現在是最好禁用AutoEventWireup,要麼在頁面OnInit方法自己創建這些事件處理程序或乾脆重寫父頁面的OnLoad方法。

編輯(回覆OP的評論如下):此過程不包括按鈕點擊等,但過程是類似的。

爲了像MyButton_Click的方法沒有你明確地創建一個事件處理程序,你必須設置OnClick屬性在這樣的aspx文件的控制工作:

<asp:button 
    id="MyButton" 
    onClick="MyButton_Click" 
    runat="server" /> 

這將促使ASP。 NET爲您創建按鈕單擊代理並將其附加到按鈕的Click事件。

+0

這個封面控制與ID以及?你能寫MyButton_Click嗎? –

+0

爲什麼建議禁用AutoEventWireup? – M4N

+0

@Martin:連接的委託生成發生在執行時,比重寫一個方法慢。 @Orion:它不包括按鈕點擊等,但過程相似。爲了像MyButton_Click這樣的方法在沒有顯式創建事件處理程序的情況下工作,您必須在aspx文件中設置控件上的OnClick屬性,如下所示:OnClick =「MyButton_Click」。這將提示ASP.NET爲您創建按鈕單擊委託並將其添加到按鈕的「Click」事件中。 –

1

查看ASP.NET page lifecycle,其中有描述負載的生命週期事件部分。

負載
的頁面調用OnLoad事件 方法在頁面上,然後遞歸 確實爲每個子控件, 它做同樣的它的每個 子控件的,直到頁面和相同所有的 控件都被加載。使用OnLoad事件方法在 控件中設置屬性並建立數據庫 連接。

而且報價:

注意使用Page_event語法創建事件 處理程序時, 基實現隱式 調用了,因此你不需要 調用它在你的方法。例如,對於 示例,無論您是否使用 創建Page_Load方法,總是會調用基頁面類的OnLoad 方法。 但是,如果用覆蓋 關鍵字(在Visual Basic中覆蓋), 覆蓋頁面 OnLoad方法,則必須顯式調用基地 方法。例如,如果在頁面上重寫 OnLoad方法,則 必須調用base.Load(MyBase.Load,在 Visual Basic中)才能運行基本 實現。

+0

有趣的是,如何明確地將事件冒泡,往往被認爲是不必要的,容易出錯並且乏味。有些人可能會爭辯說,重寫OnLoad(並調用base.OnLoad)爲應用程序增加了編譯時安全性和清晰度。 :) – bzlm

4

虛擬方法(OnLoad)和事件處理程序(Page_Load)被調用的順序由所謂的page lifecycle定義。這只是ASP.NET運行時處理傳入請求的方式(例如,使用Init,Load,Render階段)。

您可以使用的OnLoad或Page_Load中,但你必須要知道發生了什麼:

  • 內的OnLoad必須調用base.OnLoad
  • 內base.OnLoad Load事件將引發
  • Page_Load是Load事件的處理程序(它會自動連線),因此會因爲引發的Load事件而被調用。

如果您在OnLoad覆蓋中未調用base.OnLoad,則不會引發Load事件。


更新:您可以使用一個空白頁面用下面的代碼隱藏,看看會發生什麼:

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
    base.Load += new EventHandler(My_Page_Load); 
} 

void My_Page_Load(object sender, EventArgs e) 
{ 
    Response.Write("My_Page_Load<br/>"); 
} 

protected override void OnLoad(EventArgs e) 
{ 
    Response.Write("Start of OnLoad<br/>"); 
    base.OnLoad(e); 
    Response.Write("End of OnLoad<br/>"); 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Write("Page_Load<br/>"); 
} 

嘗試徵求意見的base.OnLoad(E)呼叫,重見光明。

1

Page指令,它說:Autoeventwireup =「真」

那會發生什麼,它會自動連入Load事件...(和其他一些事件,如PreInit,初始化,卸載等)

2

頁面層次結構中的OnLoad方法調用分配給Load的事件(通過+ =)。

命名Page_Load只是一個約定。在AutoEventWireUp模式下(即沒有顯式聲明的事件處理程序),此約定用於通過名稱查找事件處理程序。

如果你有.Net1可用,您可以看到設計師如何添加代碼到頁面的OnInit()添加的網頁的所有組件,並設置

this.Load += new System.EventHandler(this.Page_Load); 

.NET2仍然這樣做,但在單獨的文件隱藏在Windows \ Microsoft.Net \ Framework \ v * \ Temporary ASP.Net文件下的某處。

我發現this chart在ASP.Net頁面生命週期非常有用。

相關問題