首页 新闻 会员 周边 捐助

ASP.Net页面继承基类页面,Load事件的执行顺序?

-1
悬赏园豆:20 [已解决问题] 解决于 2011-11-14 14:28

基类PageBase 

public class PageBase:System.Web.UI.Page
{
    private void Page_Load(object sender, System.EventArgs e)
    {
        Response.Write("this is pageBase");
        Response.Write("<br>");
 
    } 
    override protected void OnInit(EventArgs e)
    {
        InitializeComponent();
        base.OnInit(e);
    }

    private void InitializeComponent()
    {
        this.Load += new System.EventHandler(this.Page_Load);
    }
 
}

 

页面Default.aspx继承PageBase

public partial class _Default :PageBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("this is default");
        Response.Write("<br>");
    }
}

页面输出的内容如下:

this is default
this is pageBase

为什么先执行Default的Page_Load,而不是先执行基类PageBase 的Load事件?

 

 

 
 
hanshuhe的主页 hanshuhe | 初学一级 | 园豆:3
提问于:2011-11-10 09:18
< >
分享
最佳答案
0

Default.Page_Load比PageBase的load事件注册的要早。

收获园豆:15
写代码的小2B | 老鸟四级 |园豆:4377 | 2011-11-10 09:53

在哪里能知道Default.Page_Load比比PageBase的load事件注册的要早呢?谢谢指点

hanshuhe | 园豆:3 (初学一级) | 2011-11-10 10:40

@hanshuhe: 如果 @ Page 指令的 AutoEventWireup 属性设置为 true(或者未定义该属性,因为该属性默认为 true),页事件将自动绑定至使用 Page_事件的命名约定的方法(如 Page_Load 和 Page_Init)。有关自动事件连接的更多信息,请参见 ASP.NET Web 服务器控件事件模型。--摘自MSDN

写代码的小2B | 园豆:4377 (老鸟四级) | 2011-11-11 10:01
其他回答(1)
0

你这里面Default.aspx页的Page_Load事件覆盖了基类页的Page_Load事件,所以先输出this is default,至于输出的this is pagebase是基类中OnInit事件输出的

收获园豆:5
artwl | 园豆:16736 (专家六级) | 2011-11-10 10:31

pagebase是基类中OnInit事件只是绑定this.Load事件而已,并没输出内容,如果它有输出内容,那么一定会在Default的Page_Load之前执行输出的

支持(0) 反对(0) hanshuhe | 园豆:3 (初学一级) | 2011-11-10 10:36

@hanshuhe: 你把基类代码改成这样:

         private void Page_Load(object sender, System.EventArgs e)
{
Response.Write("this is pageBase");
Response.Write("<br>");
}
override protected void OnInit(EventArgs e)
{
Response.Write("this is OnInit");
Response.Write("<br>");
//InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}

输出的是

this is OnInit
Default

所以说基类的Page_Load事件被子类的覆盖了,后面输出的只是

this.Load += new System.EventHandler(this.Page_Load);

这里重新绑定后输出的

支持(0) 反对(0) artwl | 园豆:16736 (专家六级) | 2011-11-10 10:45

@天行健 自强不息: 

按照你的理解在子类看来,基类的

 private void Page_Load(object sender, System.EventArgs e)
        {
            Response.Write("this is pageBase");
            Response.Write("<br>");
        }

方法是私有的,不能被继承下来,所以也不存在覆盖的问题,子类实际上就只有这个方法

 protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("this is default");
        Response.Write("<br>");
    }

而this.Load事件是可以继承下来的,那么,

this.Load += new System.EventHandler(this.Page_Load);

绑定的那个应该是自己的protected void Page_Load,而不是基类的那个Page_Load,所以基类中的Page_Load方法中的内容不应该有输出呀

支持(0) 反对(0) hanshuhe | 园豆:3 (初学一级) | 2011-11-10 11:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册