自定義Page集類可以帶來很多好處,如統一處理Cookie,安全性,參數等。不過在繼承System.Web.UI.Page實現自己的BasePage時需要注意一點:謹慎的處理構造器(Constructor)中涉及的代碼。如果疏忽了這點,可能會導致你在Vs.Net中無法所見即所得的編輯Aspx頁面,打開頁面時將拋出以下錯誤,你只能看到Html代碼界面。
導致這一錯誤的最大可能的原因就是你在BasePage的構造器裏使用了HttpContext的內容。而Vs.Net在顯示所見即所得的Aspx頁面時會初始化你的BasePage類,這時候如果使用了Request,Response等類時,由於HttpContext並不存在(因爲不是在IIS環境中,沒有PageFactory傳遞過來Http上下文),所以在初始化類時就拋出了NullReferenceException。
爲了解決此問題,最好將訪問HttpContext的代碼放到OnInit中,如下:
protected override void OnInit(EventArgs e)
{
base.OnInit (e);
HttpCookieCollection cookies = HttpContext.Current.Request.Cookies;
}
這一override方法指示在PageHandler階段被首先調用,而Vs.Net顯示頁面時並不會調用此方法,所以不會產生NullReferenceException。
如果你確實需要在構造器中進行某些Field的初始化等工作,這時又需要使用Request等內容,那麼就需要先判斷HttpContext是否爲Null。如下:
public class BasePage : Page
{
public BasePage()
{
if(HttpContext.Current != null)
{
HttpCookieCollection cookies = HttpContext.Current.Request.Cookies;
}
}
}