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

时间:2009-08-25 15:35:31

标签: 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();
   }
}

在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()

有人可以解释这里发生了什么吗?

4 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:5)

Page_Load和OnLoad是不同的东西=)

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

请参阅weblogs.asp.net上Infinities Loop条目中的this blog entry,了解更多更广泛的解释。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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