发现petshop的页面加载方式很多,有page_load、Page_PreRender、Page_PreInit这些到底有什么区别呢?
Page_PreInit是页面初始化事件,他完成的事情是:
1、检查IsPostBack来判断是否第一次加载这个页面(如果不是那会怎么样呢,是不是加载会比较快?不是,这个判断可以优化性能,再次刷新的时候就不用重新加载了);
2、创建或重新创建动态控件(这个是怎么回事?)
ASP.NET后台页面的类(下面的例子是Products类)事继承Syste.Web.UI.Page,而这个page类又是继承System.Web.UI.Control这个类,是不是在这个时候会在创建页面类的时候,就实现了这个Control类呢?拿个例子来说明会比较好吧:
publicpartialclass Products : System.Web.UI.Page {
protectedvoid Page_Load(object sender, EventArgs e) {
//get page header and title
Page.Title = WebUtility.GetCategoryName(Request.QueryString["categoryId"]);
}
}
3、动态设置主控页(什么事主控页?)
4、动态设置Theme属性(Theme应该是主题吧)
5、读取或设置配置文件属性
注意:如果请求是回发请求,则控件的值尚未从视图状态恢复,即:不应该在此事件中设置控件属性。
Init事件:
完成操作:在所有控件都已经初始化并且应用所有外观设置后引发。使用该事件来读取和初始化控件属性。
如上所知,如果上面的Pre_Init的事件处理完应该是不能完全设定前台控件的属性吧,如FontColor属性,那么在Init事件后就可以对这些属性进行设置了,那么这个事件应该多做了这些事情吧:实现了System.Web.UI.WebControl和System.Web.UI.HttpControl。
ASP.NET控件结构层次图:
Init事件后应该是加载试图状态的,说实话什么是试图状态还真不理解。在此阶段完成后就可以加载控件的ViewState属性了。可以重写LoadViewState以自定义状态还原。
接下来就是处理回放数据:处理传入窗体的数据,并相应的更新属性。只有有回发事件的控件参与这个阶段。
加载阶段(Load),执行所有请求公共操作,如数据库的查询。并初始化和创建上图的WebControls和HtmlControls的服务器控件。
下面的阶段实在难以理解,先把张逸老师讲的截图下来,慢慢理解: