本次探究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事件就会执行两边,因为事件被注册了两次。