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()
有人能解释一下这里发生了什么吗?
- BaseUC.Onload调用Control.OnLoad,它触发Load事件。
- Page_Load方法由于AutoEventWireUp = True而工作,并在Load事件执行时执行。
- 然后,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不会进入您没有加载的代码。