【问题标题】:why base.onload(e) needed for custom page base class为什么自定义页面基类需要 base.onload(e)
【发布时间】:2017-09-29 02:12:46
【问题描述】:

我有一个页面基类 (.NET4):

public class SitePageBase : System.Web.UI.Page
{
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
    }
}

以及派生类

public partial class WebsitePage : SitePageBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // some processing
    }
}

我检查了派生类中的“Page_Load”只有在基类的 OnLoad 事件处理程序上有“base.OnLoad(e)”时才有效。否则派生类中的“Page_Load”根本不会被触发。

谁能告诉我,为什么会这样?

附: AutoEventWireup 设置为 true。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    因为你重写了基类的行为,如果你不调用base.OnLoad(e),那么基类将不会继续它的实现(在这种情况下会引发Load事件)

    在您的情况下,如果您在 OnLoad 中没有做任何事情,您可以一起删除该方法,或者像我一样删除 Page_Load 并在覆盖的 OnLoad 中进行加载登录

    这些值得一读

    【讨论】:

    • 感谢您的解释。我在那里并没有真正做任何事情。所以只是将它从基类中删除。再次感谢
    【解决方案2】:

    很明显,引发Load 事件的是基础的OnLoad 函数。如果您不调用基类的 OnLoad 函数,则不会引发 Load 事件,并且永远不会调用您的 Page_Load 事件处理程序。

    【讨论】:

      【解决方案3】:

      因为 OnLoad 方法的基本实现会触发由 Page_Load 处理的事件

      【讨论】:

        【解决方案4】:

        On<Event> 的基本版本通常看起来有点像这样:

        protected virtual void OnLoad(EventArgs e)
        {
           if(Loaded != null)
              Loaded(this, e);
        }
        

        换句话说,基础成员是实际触发事件的成员。

        【讨论】:

          【解决方案5】:

          将 AutoEventWireup 设置为 false,这解决了我的问题 :)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-11-12
            • 1970-01-01
            • 1970-01-01
            • 2017-06-07
            • 1970-01-01
            • 2013-05-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多