【发布时间】:2008-09-28 23:54:56
【问题描述】:
当您在 Visual Studio 中创建新的 Web 用户控件时,默认情况下会添加 Page_Load 事件。使用它而不是覆盖控件上的基本OnLoad 事件有什么好处?难道只是Page_Load事件在OnLoad之前触发?
【问题讨论】:
标签: .net asp.net web-controls
当您在 Visual Studio 中创建新的 Web 用户控件时,默认情况下会添加 Page_Load 事件。使用它而不是覆盖控件上的基本OnLoad 事件有什么好处?难道只是Page_Load事件在OnLoad之前触发?
【问题讨论】:
标签: .net asp.net web-controls
OnLoad 方法应该是引发Load 事件的地方。我个人总是尝试处理事件,除非我需要围绕引发事件进行额外处理。
我建议在正常情况下自行处理事件。
【讨论】:
您可能会在 Microsoft 的页面生命周期中发现此 article 很有用。
【讨论】:
正如您在上面看到的,如果选择是明智的,它确实主要归结为个人选择。我见过的最好的快速但可靠的概述是http://weblogs.asp.net/infinitiesloop/archive/2008/03/24/onload-vs-page-load-vs-load-event.aspx
【讨论】:
这真的只是一个选择问题。对我来说,一个对象将一个事件附加到它自己上似乎很奇怪,尤其是当你可以覆盖一个方法时。
我认为 ASP.NET 团队使用事件是因为这是 ASP 中 Global.asa 的模型,并且可以降低不了解继承和覆盖虚拟方法的开发人员的门槛。
重写该方法确实需要更多关于页面生命周期的知识,但它并没有什么“错误”。
【讨论】:
阅读 MSDN 页面上标题为:“ASP.NET Web 服务器控制事件模型”的部分:“绑定页面事件”(link to the page) 有一些有用的语句如下:
AutoEventWireup 属性的一个缺点是它要求页面事件处理程序具有特定的、可预测的名称。这限制了您命名事件处理程序的灵活性。另一个缺点是性能受到不利影响,因为 ASP.NET 在运行时搜索方法。对于具有高流量的网站,对性能的影响可能很大。
(AutoEventWireup 标志开启 Page_Load 等方法)
【讨论】:
即使您是从 UserControl 继承的,我认为您应该避免在不必要的情况下覆盖受保护的方法。 Page_Load 可以让您更轻松地添加特定于您的 UserControl 的代码。
仅当您需要绝对控制何时(/如果)Load 事件被触发时才覆盖 OnLoad(这应该很少见,IMO)。
【讨论】:
我认为是一样的。 恕我直言,有了事件,您就有了更多的灵活性,因为您的事件可以发生多个监听器!
【讨论】:
我认为这两种方法有一个潜在的显着差异。
我指的是控制执行顺序的能力。
如果您正在覆盖,您知道基类 Load 何时发生,因为您正在调用它。这提供了更多的控制,但正如许多人所说的那样,这可能是一件坏事。
如果您使用事件,您无法保证调用顺序。这迫使您编写 Load 事件,该事件应该不知道超类在 Load 阶段正在做什么。我认为这将是首选方法,也许这就是为什么 VS 自动生成的代码是这种方式的原因。
【讨论】: