基类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事件?
Default.Page_Load比PageBase的load事件注册的要早。
在哪里能知道Default.Page_Load比比PageBase的load事件注册的要早呢?谢谢指点
@hanshuhe: 如果 @ Page 指令的 AutoEventWireup 属性设置为 true(或者未定义该属性,因为该属性默认为 true),页事件将自动绑定至使用 Page_事件的命名约定的方法(如 Page_Load 和 Page_Init)。有关自动事件连接的更多信息,请参见 ASP.NET Web 服务器控件事件模型。--摘自MSDN
你这里面Default.aspx页的Page_Load事件覆盖了基类页的Page_Load事件,所以先输出this is default,至于输出的this is pagebase是基类中OnInit事件输出的
pagebase是基类中OnInit事件只是绑定this.Load事件而已,并没输出内容,如果它有输出内容,那么一定会在Default的Page_Load之前执行输出的
@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);
这里重新绑定后输出的
@天行健 自强不息:
按照你的理解在子类看来,基类的
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方法中的内容不应该有输出呀