2009-01-16 84 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

相关问题