2009-01-16 40 views
3

當創建一個新的WebForm時,Visual Studios會在後面的代碼中創建一個Page_Load處理程序作爲默認值,這很酷。所以多年來,我一直把代碼放在Page_Load中去做一些控件的屬性設置。最近,我使用Reflector來查看由Microsoft編寫的一些程序集,並且看到他們已經將相同類型的邏輯放入名爲OnLoad的方法中(據稱會引發加載事件)。所以我開始懷疑,在OnLoad或Page_Load中,最好的地方在哪裏設置控件的屬性?或者完全採用不同的方法?如果不是Page_Load,爲什麼Studio會將其添加到背後的代碼中?爲什麼Visual Studio會爲您提供Page_Load for WebForms作爲默認值?

我的最終想法:雖然我知道將邏輯放入OnLoad可以正常工作,但我現在可能會堅持使用Page_Load,因爲這是常規的。我問這個問題是否真的發現我是否在開始看到OnLoad出現在其他人的代碼中後錯過了一些新的東西。謝謝大家的深思熟慮的答案!

回答

3

Page_Load只是OnLoad的autoeventwireup。你會認爲它沒有使用任何區別,但我同意K. Scott Allen at Ode to Code,你應該通常只是在你試圖做出意想不到的事情時偏離標準。覆蓋像OnLoad這樣的虛擬方法表明你正在嘗試做一些不同的事情,比如不調用base.Onload,大多數程序員通常不會這樣做。

1

你不想使用OnLoad,他們使用它的原因是因爲它是提高Page_Load事件的包裝。他們把邏輯放在那裏,因爲他們沒有處理Page_Load事件。

總之,繼續使用Page_Load。

1

通常,OnX方法是引發事件X的方法。它們有點像類的內部事件處理程序。這意味着,當你編寫一個類,其中包括檢測某個事件時,你通常會調用一個方法:1.做你的類在這種情況下需要做的事情,2.啓動外部事件。

我相信這種現象的一個核心原因是,就目前來看,您不能只調用事件委託來觸發事件,您必須始終檢查該委託是否爲空。所以你想在一個方法中封裝這個檢查。

總之,除非你正在編寫自己的具有Load事件的類,否則不需要考慮OnLoad方法。

1

到目前爲止所有非常有效的點。但不要讓這些傢伙嚇倒你。如果你想使用OnLoad方法,你不會傷​​害任何東西。只是不要忘記打電話給base.OnLoad()。

+0

我實際上做了你最近剛剛提到的,只是爲了看看一切是否仍然有效。但是後來我開始想知道是否應該在我自己的代碼之前先調用base.OnLoad(),或者反過來。 – barneytron 2009-01-17 02:49:41

1

事實上,如果你回到ASP.Net 1.1開發的壞日子,你實際看到的接線,正在發生,爲您創建的每一個網頁:

#region Web Form Designer generated code 
    override protected void OnInit(EventArgs e) 
    { 
     InitializeComponent(); 
     base.OnInit(e); 
    } 

    /// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor. 
    /// </summary> 
    private void InitializeComponent() 
    {  
     this.Load += new System.EventHandler(this.Page_Load); 
    } 
    #endregion 

而現在每然後,我會做一些事情,導致VS刪除InitializeComponent中的那一行,並且無法弄清楚爲什麼我的頁面停止了任何操作。

+0

啊,你的片段帶回了記憶...... – barneytron 2009-01-17 02:51:54

相關問題