今天整理代碼的時候發現一直對母版頁內ContentPlaceHolder的引用,使用 的控件查找方式:
程序代碼
this.Master.FindControl("SideBarBox") as ContentPlaceHolder
這樣做的原理大概就是通過在母版頁內查找控件ID,然後通過反射進行調用 的。反射本身就是極其影響效率的一種方式,特別是在頁面訪問量特別大的時候 ,不做緩存處理,那麼對於服務器來說是一場噩夢。雖然還有生成靜態頁面的方 法,但是現在談的是如何使用強類型引用母版頁子控件。
於是開始做實驗,首先在母版頁聲明:
程序代碼
public static ContentPlaceHolder sideBarBox;
然後在protected void Page_Load(object sender, EventArgs e)裡面將頁 面的ContentPlaceHolder引用給sideBarBox。結果運行出錯,沒有給對象賦值。
仔細想了一下,估計是子頁的Page_Load比母版頁的Page_Load要先處理,所 以導致為空。看了一下MSDN,確實是這樣的,頁面的加載順序如下:
母版頁控件 Init 事件。
內容控件 Init 事件。
母版頁 Init 事件。
內容頁 Init 事件。
內容頁 Load 事件。
母版頁 Load 事件。
內容控件 Load 事件。
內容頁 PreRender 事件。
母版頁 PreRender 事件。
母版頁控件 PreRender 事件。
內容控件 PreRender 事件。
知道這些問題就好解決了,將母版頁的Page_Load放到Page_Init裡面去:
程序代碼
protected void Page_Init(object sender, EventArgs e)
{
sideBarBox = SideBarBox;
}
然後在子頁這樣調用:
程序代碼
using System;
using Yeeoh.View.Controls.FrontEnd;
public partial class error : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
FE_Error.InitErrorPage(ErrorBox, MasterPage.sideBarBox);
}
}
呵呵,一切問題都解決了,然後發現在母版頁中的ContentPlaceHolder可以 進行嵌套,你可以用這樣的方法隨便進行覆蓋或其他操作。
在上海開心的日子就要結束了,這一年的旅行讓我大開眼界,結識了不少的 朋友,個個都十分的優秀。甚至於我已經習慣於和他們相處,並產生留在這裡的 想法。不過現實卻是有太多的事情需要我去做,放棄在上海安逸穩定的生活,實 在是迫不得已。
希望在接下來創業的日子裡面,我還會有時間,有心情,寫這些很無趣的東 西,呵呵,一切都會更好。