base.OnLoad(e)在ASP.NET页面中

我可能误解了base.OnLoad(e);的含义base.OnLoad(e); 我的理解是这个语句将调用它所调用的类的基类的OnLoad方法。 但是,当我使用调试器逐步执行代码时,我看到不同的结果。

 public abstract class BaseUC : System.Web.UI.UserControl { protected override void OnLoad(EventArgs e) { base.OnLoad(e); SomeAbstractMethod(); } } 

在ascx.cs具体类中

 public partial class MyUserControl : BaseUC { protected void Page_Load(object sender, EventArgs e) { //On Load logic } } 

我在base.OnLoad(e)上有一个断点。 当我按F11(步入)时,调试器将我带到MyUserControl的Page_Load ,因此控制流程为:

 BaseUC.OnLoad() MyUserControl.Page_Load() BaseUC.SomeAbstractMethod() 

有人能解释一下这里发生了什么吗?

  1. BaseUC.Onload调用Control.OnLoad,它触发Load事件。
  2. Page_Load方法由于AutoEventWireUp = True而工作,并在Load事件执行时执行。
  3. 然后,BaseUC将继续执行,调用SomeAbstractMethod。

Page_Load和OnLoad是不同的东西=)

Page_Load是一个存在于页面上的方法,由ASP.net运行时调用(感谢AutoEventWireUp的魔力)OnLoad是引发Load事件的方法,所以通过在base.OnLoad(e)之前调用代码来调用你可以导致代码在引发事件之前执行,之后代码在引发事件后运行。

请参阅weblogs.asp.net上Infinities Loop条目中的这篇博客文章 ,以获得更广泛的解释。

奇怪的是,你期待看到什么? 我不认为你会看到它进入base.OnLoad(e) ,因为那时你的基类是System.Web.UI.UserControl ,那是一个系统类,…所以你很有可能没有源代码可以进入它。

您是否为System.Web加载了调试符号? F11不会进入您没有加载的代码。