Page_Load不是一種虛擬方法。什麼叫這種方法,它是如何做到的?它是反射還是其他技術?還有多少事件以這種方式處理?什麼是Page_Load,它是如何做的?
也是最好處理重載的OnLoad或Page_Load中的東西?他們有什麼不同?
Page_Load不是一種虛擬方法。什麼叫這種方法,它是如何做到的?它是反射還是其他技術?還有多少事件以這種方式處理?什麼是Page_Load,它是如何做的?
也是最好處理重載的OnLoad或Page_Load中的東西?他們有什麼不同?
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
事件。
查看ASP.NET page lifecycle,其中有描述負載的生命週期事件部分。
負載
的頁面調用OnLoad事件 方法在頁面上,然後遞歸 確實爲每個子控件, 它做同樣的它的每個 子控件的,直到頁面和相同所有的 控件都被加載。使用OnLoad事件方法在 控件中設置屬性並建立數據庫 連接。
而且報價:
注意使用Page_event語法創建事件 處理程序時, 基實現隱式 調用了,因此你不需要 調用它在你的方法。例如,對於 示例,無論您是否使用 創建Page_Load方法,總是會調用基頁面類的OnLoad 方法。 但是,如果用覆蓋 關鍵字(在Visual Basic中覆蓋), 覆蓋頁面 OnLoad方法,則必須顯式調用基地 方法。例如,如果在頁面上重寫 OnLoad方法,則 必須調用base.Load(MyBase.Load,在 Visual Basic中)才能運行基本 實現。
有趣的是,如何明確地將事件冒泡,往往被認爲是不必要的,容易出錯並且乏味。有些人可能會爭辯說,重寫OnLoad(並調用base.OnLoad)爲應用程序增加了編譯時安全性和清晰度。 :) – bzlm
虛擬方法(OnLoad)和事件處理程序(Page_Load)被調用的順序由所謂的page lifecycle定義。這只是ASP.NET運行時處理傳入請求的方式(例如,使用Init,Load,Render階段)。
您可以使用的OnLoad或Page_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)呼叫,重見光明。
Page指令,它說:Autoeventwireup =「真」
那會發生什麼,它會自動連入Load事件...(和其他一些事件,如PreInit,初始化,卸載等)
頁面層次結構中的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頁面生命週期非常有用。
這個封面控制與ID以及?你能寫MyButton_Click嗎? –
爲什麼建議禁用AutoEventWireup? – M4N
@Martin:連接的委託生成發生在執行時,比重寫一個方法慢。 @Orion:它不包括按鈕點擊等,但過程相似。爲了像MyButton_Click這樣的方法在沒有顯式創建事件處理程序的情況下工作,您必須在aspx文件中設置控件上的OnClick屬性,如下所示:OnClick =「MyButton_Click」。這將提示ASP.NET爲您創建按鈕單擊委託並將其添加到按鈕的「Click」事件中。 –