本次探究Page
页面加载的时候,它们的执行顺序
BasePage
public class BasePage : Page
{
public string BaseName { get; set; }
public BasePage()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
protected override void OnLoad(EventArgs e)
{
int i = 1;
this.Load += Page_Load;
base.OnLoad(e);
i++;
SearchData();
}
protected void Page_Load(object sender, EventArgs e)
{
this.BaseName = "父亲load事件";
}
protected override void OnInit(EventArgs e)
{
int i = 1;
this.Init += Page_Init;
base.OnInit(e);
i++;
}
protected void Page_Init(object sender, EventArgs e)
{
this.BaseName = "父亲init事件";
}
/// <summary>
/// 获取数据
/// </summary>
public virtual void SearchData()
{
}
}
public partial class TestPage : BasePage
{
public string Name { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
this.Name = "儿子load事件";
}
protected override void OnLoad(EventArgs e)
{
int i = 1;
base.OnLoad(e);
i++;
}
protected override void OnInit(EventArgs e)
{
int i = 1;
//this.Init += Page_Init;
base.OnInit(e);
i++;
}
protected void Page_Init(object sender, EventArgs e)
{
this.BaseName = "儿子init事件";
}
public override void SearchData()
{
this.Name = "执行";
}
}
每一个方法体都打上断点 运行
父类构造函数》子类构造函数》子类OnInit
》子类base.OnInit(e);
》父类OnInit
》父类base.OnInit(e);
》【子类Page_Init(object sender, EventArgs e)
或 父类Page_Init(object sender, EventArgs e)
事件依次执行】》父类OnInit
中剩余代码执行完毕》子类OnInit
中剩余代码执行完毕》子类OnLoad
》子类base.OnLoad(e);
》父类OnLoad
》父类base.OnLoad(e);
》【子类Page_Load(object sender, EventArgs e)
或 父类Page_Load(object sender, EventArgs e)
事件依次执行】》父类OnLoad
中剩余代码执行完毕》子类OnLoad
中剩余代码执行完毕执行子类Page_Init(object sender, EventArgs e)
或 父类Page_Init(object sender, EventArgs e)
的先后顺序,是由注册事件的先后顺序决定的,如果在父类构造函数中注册事件,那么就先执行父类的事件。
public class BasePage : Page
{
public string BaseName { get; set; }
public BasePage()
{
this.Load += Page_Load;
this.BaseName = "父亲";
//
//TODO: 在此处添加构造函数逻辑
//
}
另外有个小知识点就是页面里我们可以看到
AutoEventWireup="true"
这样一个设置
这是在页面初始化的时候会自动将Page_Load
事件或者Page_Init
事件注册。所以如果将注释的注册事件取消注释,子类的Page_Init
事件就会执行两边,因为事件被注册了两次。