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

Dot*_*ude 5 c# asp.net user-controls

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

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

    SomeAbstractMethod();
   }
}
Run Code Online (Sandbox Code Playgroud)

在ascx.cs中的具体类

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

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

BaseUC.OnLoad()
MyUserControl.Page_Load()
BaseUC.SomeAbstractMethod()
Run Code Online (Sandbox Code Playgroud)

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

sis*_*sve 11

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

  • DotnetDude,既可以说是安全的,也是完全正确的.最顶层的OnLoad将触发Load事件(这是一个有点常见的主题,用于命名引发事件Xxx OnXxx的方法). (2认同)

Rob*_*Rob 5

Page_Load和OnLoad是不同的东西=)

Page_Load中是这是由ASP.net运行时调用的页面上存在的方法(感谢AutoEventWireUp的魔法)的OnLoad是通过把代码引发Load事件,因此该方法之前的base.OnLoad(五)打电话给你可以使代码为代码执行被升高之前的情况下,之后它运行的事件被引发.

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