在 Visual Studio 中创建新的 Web 用户控件时,默认情况下会添加 Page_Load 事件。使用它而不是覆盖OnLoad
控件上的基本事件有什么好处?只是Page_Load
事件之前触发了OnLoad
吗?
8 回答
该方法应该是引发事件OnLoad
的地方。Load
我个人总是尝试处理事件,除非我需要围绕引发事件进行额外处理。
我建议在正常情况下处理事件本身。
您可能会发现这篇关于 Microsoft 页面生命周期的文章很有用。
正如您在上面看到的,如果选择是明智的,它确实主要归结为个人选择。我见过的最好的快速但可靠的概述是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 服务器控制事件模型”(链接到页面)有一些有用的语句,如下所示:
AutoEventWireup属性的一个缺点是它要求页面事件处理程序具有特定的、可预测的名称。这限制了您命名事件处理程序的灵活性。另一个缺点是性能受到不利影响,因为 ASP.NET 在运行时搜索方法。对于具有高流量的网站,对性能的影响可能很大。
(AutoEventWireup标志打开诸如 Page_Load 之类的方法)
即使您继承自UserControl
,我认为您应该避免在不必要的情况下覆盖受保护的方法。可以让Page_Load
您更轻松地添加特定于您的UserControl
.
仅OnLoad
当您需要绝对控制何时(/如果)Load
触发事件时才覆盖(这应该很少见,IMO)。
我认为是一样的。恕我直言,有了事件,你就有了更多的灵活性,因为你的事件可以发生多个听众!
我认为这两种方法存在一个潜在的显着差异。
我指的是控制执行顺序的能力。
如果您正在覆盖,您知道基类 Load 何时发生,因为您正在调用它。这提供了更多的控制,但正如许多人所说的那样,这可能是一件坏事。
如果您使用事件,您无法保证调用顺序。这迫使您编写 Load 事件,该事件应该不知道超类在 Load 阶段正在做什么。我认为这将是首选方法,也许这就是为什么 VS 自动生成的代码是这种方式的原因。