3

创建新的 WebForm 时,Visual Studios 在后面的代码中默认创建一个 Page_Load 处理程序,这很酷。所以多年来,我总是将代码用于在 Page_Load 中设置控件的属性。最近,我使用 Reflector 查看了一些微软编写的程序集,发现他们将相同类型的逻辑放在了一个名为 OnLoad 的方法中(据说会引发加载事件)。所以我开始想,真正设置控件属性的最佳位置在哪里,在 OnLoad 或 Page_Load 中?还是完全不同的方法?如果不是 Page_Load,为什么 Studio 将其添加到后面的代码中?

我最后的想法: 虽然我知道将逻辑放在 OnLoad 中可以正常工作,但我现在可能会坚持使用 Page_Load,因为这是传统的。在我开始看到 OnLoad 出现在其他人的代码中之后,我真的问了这个问题,以确定我是否错过了一些新的东西。谢谢大家周到的回答!

4

5 回答 5

3

Page_Load 只是 OnLoad 的 autoeventwireup。你会认为使用哪个没有任何区别,但我同意Ode to Code 的 K. Scott Allen 的观点,即你通常应该只在你试图做一些意想不到的事情时才偏离规范。覆盖像 OnLoad 这样的虚拟方法表明您正在尝试做一些不同的事情,例如不调用 base.Onload,而大多数程序员通常不会这样做。

于 2009-01-16T06:48:38.200 回答
1

您不想使用 OnLoad,他们使用它的原因是因为它是引发 Page_Load 事件的包装器。他们把逻辑放在那里,因为他们没有处理 Page_Load 事件。

总之,继续使用 Page_Load。

于 2009-01-16T05:37:01.370 回答
1

通常,OnX 方法是引发事件 X 的方法。它们有点像类的内部事件处理程序。这意味着,当您编写一个检测特定事件发生的类时,您通常会调用一个方法:1. 执行您的类在这种情况下需要执行的操作,2. 触发外部事件。

我相信这种情况流行的核心原因之一是,就目前而言,您不能只调用事件委托来触发事件,您必须始终检查该委托是否为空。所以你想把这个检查封装在一个方法中。

简而言之,除非您正在编写自己的具有 Load 事件的类,否则您不需要考虑 OnLoad 方法。

于 2009-01-16T06:04:34.170 回答
1

到目前为止所有非常有效的观点。但不要让这些人吓到你。如果您想使用 OnLoad 方法,您不会受到任何伤害。只是不要忘记调用 base.OnLoad()。

于 2009-01-16T08:44:29.230 回答
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 中的那条小行,并且无法弄清楚为什么我的页面停止做任何事情。

于 2009-01-16T09:57:00.300 回答