首先,一些基本的細節:ASP NET的形式和代碼隱藏繼承
- 我使用Visual Studio 2008團隊版
- 我使用C#的ASP.NET 2.0 Web項目(不MVC )。
問題
我有一個用戶創建形式,然而,我還需要一個表單編輯用戶詳細信息,這將是相同的,在設計方面,除了事實,即它會預先加載值並在窗體按鈕的單擊事件中使用替代邏輯。
我不想簡單地創建一個這個頁面的副本,因爲在.aspx和aspx.cs文件中會有很多重複的代碼(並且我需要爲其他幾個表單執行相同的操作)。我一直在使用C#.NET WinForms一段時間,但這是我使用ASP .NET的第一個真正的項目,所以我還沒有決定我對這個特定問題的最喜歡的方法。
我正在尋找什麼被認爲是在這種情況下繼承形式的最佳方法。
基本形式
目前,它繼承了其中包含整個網站使用佈局的母版頁就一些細節問題。
它具有所有必需的輸入,每個都帶有驗證控件,還有一個AJAX更新面板來檢查用戶名的可用性。我當然使用AJAX後回傳的代碼隱藏文件,以及服務器端驗證(如果客戶端沒有啓用Java腳本)。
當然,按鈕點擊事件包含所有的邏輯,一旦輸入已被驗證。
我的想法
我看到在網絡上幾個不同的解決方案,以及基於我已經想出了什麼,我認爲可能會進行得很順利,一個粗略的想法。
使用嵌套母版頁以繼承網站的全局佈局以及包含基本形式。
設置要保護的嵌套母版頁上的控件,而不是私有的。
創建添加和編輯用戶頁面,繼承嵌套母版頁,也繼承嵌套母版頁的類,以便獲得對其所有控件的訪問權限(我在某處讀取不能繼承其他控件頁...不知道,如果主頁也一樣?)
然後,我需要重寫DoUserSubmit_Click(我的表單的按鈕)事件,以在每個頁面上使用創建或編輯邏輯。
還需要使用編輯頁面上的Page_Load事件來填充所有嵌套母版頁輸入的值。
我已經開始在嵌套母版頁的嘗試,但是,因爲這繼承了母版類,而不是Page類,IsValid屬性不能提供給我。我想知道如果我將嵌套母版頁繼承到實際顯示驗證控件的實際版本中,IsValid是否可以在每個頁面上正常工作?
我對暴露每個控件也不太確定,通常我會保留所有私人和設置訪問器,但是給定這個窗體上的控件的數量(以及其他我想使用此模式的窗體)似乎事情會混亂那樣。
編輯:我繼續遠一點與嵌套母版頁,發現其所有控件都已經通過繼承它,而不是System.Web.UI.Page設置爲保護,所以,我可以訪問所有的控件。
我無法重寫點擊事件,但我確實使用了替代解決方案,該解決方案允許我執行一些理智檢查,因此效果很好。
不幸的是,由於頁面現在繼承了我的嵌套母版頁的類,而不是Page類,因此我無法訪問Page.IsValid,這在客戶端驗證無效的情況下非常重要,或者被禁用。
這裏是迄今爲止解決方案:
在嵌套母版頁:
/// <summary>
/// This method is what contains the logic to perform once the form has been submitted.
/// </summary>
protected abstract void DoPostBack();
protected void DoRegister_Click(object sender, EventArgs e)
{
if (IsPostBack) //Would prefer to do IsValid check here.
{
DoPostBack();
}
}
中的添加/編輯頁面:
protected override void DoPostBack()
{
if (IsValid) //IsValid doesn't exist in this context.
{
//My logic here...
}
}
編輯完
我也考慮過爲每個表單創建用戶定義的控件,並在每個頁面上使用它,根據需要公開事件。但是,從我讀過的內容來看,這不允許將設計與邏輯進行適當的分離,就像使用代碼隱藏一樣。雖然我會承認,但我還沒有嘗試過。
我不想深入研究當前的設計選擇,因爲可能有更好的解決方案,我還沒有想到。
任何建議非常感謝。謝謝!
我會考慮這個解決方案進一步,謝謝。 – Geekman 2011-01-05 10:37:59
我剛剛在用戶控件中實現了這個窗體,並且這一切都工作得很好。除此之外,目前IsValid仍然不存在於控件中。我會進一步調查。 – Geekman 2011-01-05 11:00:00
也許Page.IsValid? – volpav 2011-01-05 11:02:01