【问题标题】:base.OnLoad(e) in a ASP.NET pageASP.NET 页面中的 base.OnLoad(e)
【发布时间】:2009-08-25 23:40:27
【问题描述】:

我可能误解了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(step into)时,调试器会将我带到 MyUserControl 的Page_Load,所以控制流程是:

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

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

【问题讨论】:

    标签: c# asp.net user-controls


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

    【讨论】:

    • "BaseUC.Onload 调用触发 Load 事件的 Control.OnLoad。"是哪条线造成了这种情况?
    • 我想这是我不明白的部分。为什么 base.OnLoad(e) 调用 Control.OnLoad (在本例中为 MyUserControl.Page_Load() )?
    • @DotnetDude,上面的 OnLoad 的每个覆盖实现都包含对 base.OnLoad 的调用,直到它到达触发 Load 事件的 Control.OnLoad。
    • 是否可以肯定地说 base.OnLoad(e) 引发了一个事件,并且该事件的所有订阅者 (MyUserControl.Page_Load()) 都会收到通知,这就是执行 Page_Load 的原因吗?跨度>
    • DotnetDude,这话既安全又完全正确。最顶层的 OnLoad 将触发 Load 事件(命名引发 Xxx OnXxx 事件的方法是一个比较常见的主题)。
    【解决方案2】:

    Page_Load 和 OnLoad 是不同的东西 =)

    Page_Load 是存在于页面上的方法,由 ASP.net 运行时调用(感谢 AutoEventWireUp 的魔力) OnLoad 是引发 Load 事件的方法,因此通过将代码放在 before base.OnLoad(e) 调用可以让代码在事件引发之前执行,之后代码在事件引发之后运行。

    请查看 weblogs.asp.net 上 Infinities Loop 条目中的 this blog entry 以获得更广泛的解释。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我预计:BaseUC.OnLoad() BaseUC.SomeAbstractMethod() MyUserControl.Page_Load()
      【解决方案4】:

      您是否为 System.Web 加载了调试符号? F11 不会单步执行您未加载的代码。

      【讨论】:

      • -1 肯定不是这里发生了什么......其他答案得到了正确的想法
      • 这是问题中最明显的部分。 OP 正试图进入 BCL 中的一个方法......其他海报对 Page_Load 的调用是绝对正确的,但了解调试器也在做什么也很重要。
      • 能够进入 System.Web 将显示 Load 事件的触发,并且 Page_Load 将对它做出反应。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多