【问题标题】:Why does Visual Studio give you Page_Load for WebForms as a default?为什么 Visual Studio 会默认为您提供 WebForms 的 Page_Load?
【发布时间】:2009-01-16 05:33:42
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net visual-studio onload pageload


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      简而言之,继续使用 Page_Load。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 我实际上做了你最近提到的事情,只是为了看看一切是否仍然有效。但后来我开始想知道是否应该在我自己的代码之前先调用 base.OnLoad() 还是反过来。
          【解决方案5】:

          确实,如果您回到 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 中的那条小行,并且无法弄清楚为什么我的页面停止做任何事情。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-24
            • 1970-01-01
            • 1970-01-01
            • 2018-04-12
            • 1970-01-01
            • 2020-05-04
            相关资源
            最近更新 更多