關於自己定義Page的一個小問題
[Key word:Page]
[測試環境:OS,WinXp+sp2;開發環境,Microsoft VS.NET2003;.Framework,1.1]
前些時候遇到這樣的一個問題:
我自己定義了一個通用Page,繼承自System.Web.UI.Page
public class BasePage:Page{
}
完了之後,又這樣做了一個簡單的繼承:
public class AdminPage:BasePage{
}
然後在我的設計頁面裡的Web Form繼承自AdminPage的,會出現錯誤,提示父類不能實現而不能使用設計模式。
這是可能理解的,因為在設計的時候,你的web form要實現這樣的一個類,當然這個類得是存在的。但沒想到遇到以下幾個問題的時候,也會出現同樣的問題:
1、自己定義的Page類裡有任何的純虛函數的時候,也沒有辦法實現(在設計時),且不說多次繼承。
2、在與建構函式相關的所有方法中,有訪問不到的資料時,也會出現錯誤。
這裡我討論一下第二種情況以及解決方案,先看我的一個繼承自Page類的代碼(部份):
public class BasePage : Page,IUIPage
{
fileds#region fileds
protected IVisitor m_user;
protected PagesTypes m_pageType;
protected string m_userIP;
protected System.DateTime m_requestTime = System.DateTime.Now;
private bool m_showDebugMsg;
private bool m_showCopyRight;
private readonly string m_copyright;
#endregion
public BasePage()
{
this.m_showDebugMsg = WaveSystem.SystemVarible["ShowDebugMessage"].ToString().ToLower()=="yes";
this.m_showCopyRight = WaveSystem.SystemVarible["ShowCopyRight"].ToString().ToLower()=="yes";
}
}
這裡的WaveSystem.SystemVarible["ShowDebugMessage"]在運行時會從資料庫裡取得相關資料。而這樣給我帶來的後果是:所有繼承自BasePage的web form都不能使用設計頁面了(都是HTML模式)。這讓我很鬱悶,因為這些資訊也只有在運行時才有意義,設計環境不知道,所以它必須在設計的時候也取得WaveSystem.SystemVarible["ShowDebugMessage"]的值,而這顯然是不能實現的。
就這個問題,上次也簡單的討論過一次,後來沒找到解決方案,只好用常量先代替:
this.m_showDebugMsg = true;
this.m_showCopyRight = false;
然而今天偶然遇到一個方法,因為我不能絕對保證在運行時也可以得到WaveSystem.SystemVarible["ShowDebugMessage"]的值,所以修改了一下代碼(部份):
public BasePage()
{
try
{
this.m_showDebugMsg = WaveSystem.SystemVarible["ShowDebugMessage"].ToString().ToLower()=="yes";
this.m_showCopyRight = WaveSystem.SystemVarible["ShowCopyRight"].ToString().ToLower()=="yes";
}
catch
{
this.m_showDebugMsg = true;
this.m_showCopyRight = false;
}
}
歪打正著,沒想到這樣一改,在設計模式下也通過了(注意,要先編譯一下這個頁面)。那麼簡單的結論就是:設計web form的時候,環境是在“運行”我們的部份代碼的。而又不是真正的運行,甩以有一些只有在運行時才能得到的資料,在設計時如果“訪問”到了,那麼就會出現這樣的錯誤。
我不知道VS.net2005裡是否也會有這樣的問題,但不管怎樣,這次偶然的結果為我提供了一個方法解決這一問題。而關於虛函數及多次繼承問題,還有待解決。