2012-04-17 83 views
6

假設我們有一個帶有文本框和按鈕的漂亮標準窗體(爲了簡單起見)。你想要處理一個Click事件並根據用戶的輸入做一些事情。什麼時候連接事件處理程序asp.net

我想知道,當你在代碼隱藏中爲Click事件的事件處理程序連線時,它是否重要?如果是這樣,那麼最好的地方放在哪裏?頁面加載?頁面初始化?我嘗試了兩個地方,但沒有注意到任何區別。或者這只是程序員的個人偏好?我已經搜索了幾次互聯網,但還沒有找到任何滿意的答案。

我知道什麼時候實際的方法執行,只是不知道接線部分

+0

您正在使用像MVC的框架的任何或該WebForms的ASP.Net? – 2012-04-17 23:15:18

+3

@JeremyThompson。在MVC中沒有代碼背後,感謝上帝! – gdoron 2012-04-17 23:20:06

+0

@JeremyThompson,webforms ... :) – walther 2012-04-18 00:05:42

回答

15

如你所知,有幾個Page_xxx事件處理程序,像InitLoadPrerender ......這個事件的控件存在,網頁以及用戶控制(實際上他們得到的形式Control,它包含所有這些事件)。如果你讀的頁面指向該鏈接時仔細事件被觸發,你就會明白

此事件相關的ASP.NET Page Life Cycle

。所以,如果你在觸發事件之前發生的任何頁面生命週期事件中綁定你的事件處理程序,那麼可以保證你的事件處理程序將被及時綁定觸發。

這些是主要的生命週期步驟:

PreInit -> Init -> InitComplete -> PreLoad -> Load -> [Control events] -> 
LoadComplete -> PreRender -> SaveStateComplete -> Render -> Unload 

並不是所有的人都相關的事件,但是,如果有必要,你可以覆蓋相應OnXxx()功能,如OnPreInit()。 (這通常只在自定義服務器控件上完成)。

可以綁定事件Page_InitPage_Load,因爲控制事件的所有控件的加載後triggerd完成Load步驟以自下而上的方式發生,首先在頁面中,然後在所有子控件中遞歸地發生。

Load完成後,觸發的第一個事件是更改事件,如TextChangedSelectionChanged。然後觸發所有其他事件,如Click

如果您在PreRender或Unload中綁定事件,則不會觸發它們。如果你在Init或Load中做過,他們會

所以它可能看起來像它的安全,在初始化或負載結合,但事實並非如此

它可能看起來像有約束他們在InitLoad沒有什麼特別的原因,因爲他們會稍後在頁面生命週期中被觸發。但是,由於.aspx中定義的綁定發生在Init期間,程序員會預期在Load事件中所有事件都已綁定。如果這個程序員在後面的代碼中提出了一個子控件事件會發生什麼? Load事件首先發生在控制樹的根中,並且它們在所有的子節點上遞歸地發生。所以,當程序員試圖提高兒童控制事件的時候,它就不會受到束縛。所以這不會按預期工作。這足以在Load事件中考慮不安全地綁定事件。這就是爲什麼你應該總是綁定事件Init

看看下面這張圖看到的頁面&兒童事件的執行順序: ASP.NET Page Life Cycle Diagram

+0

這就是我發佈我的問題的原因。我想更深入地瞭解WHY和WHEN做某些事情。我想我理解頁面生命週期,什麼時候創建我的控件等,但不知道這個接線事情,因爲我看到了不同的方法。雖然有些程序員在Load事件中執行此操作,但其他人員像Init。所以爲了完成我的問題 - 我是否正確地理解它,這並不重要,我只需要確保在Load事件完成後不要執行它。 (LoadComplete,Prerender等) – walther 2012-04-18 00:15:48

+0

我認爲這會在編輯之後徹底回答你的問題。 – JotaBe 2012-04-18 01:01:28

+0

是的,終於得到了我的問題的滿意答案,謝謝:) – walther 2012-04-18 07:22:26

1

我一直在控制標籤中排雷。如果我這樣做,很明顯事件處理程序是存在的。

<asp:Button ID="btnRefresh" runat="server" Text="Refresh" OnClick="btnRefresh_Click" /> 

如果我必須要連接一個事件處理程序的代碼隱藏,我會把它在Page_Load中作爲私有函數調用。

+0

是的,我知道這種可能性,但是...我並不是真正的粉絲,因爲我喜歡儘可能多地分開我的圖層。我有一個編碼人員在表現層(javascript,html,css ..)上工作,我真的沒有看到爲什麼他應該知道甚至關心佈線處理程序的原因。如果我一個人工作,這可能會很好,但這並不能真正回答我的問題。你會在什麼地方連接一個處理程序,如果你必須在代碼隱藏方面做到這一點? – walther 2012-04-18 00:09:06

+0

@walther - 感謝您的評論。我明白需要將事情分開。如果我不得不將它放在代碼隱藏中,我會首先創建一個函數來設置我的事件處理程序,然後從Page_Load中調用函數。 – DaveB 2012-04-18 01:31:25

相關問題