2013-08-22 60 views
0

假設我有兩個具有相同服務器端控件的ASPX頁面。ASPX頁面可以共享文件後面的代碼嗎?

~/TemplateA/Contact.aspx 
~/TemplateB/Contact.aspx 

默認情況下,它們被映射到它們各自的代碼隱藏文件。

~/TemplateA/Contact.aspx.cs 
~/TemplateB/Contact.aspx.cs 

相反,我想它們指向一個單一的,共同的代碼隱藏文件,如

~/Classes/Contact.aspx.cs 

我已經將其從基本繼承「聯繫人」功能類,誰公開整個業務邏輯,但我仍然無法確定如何將頁面的服務器端控件引用到基礎的「Contact」類中;爲例,我想能寫:

this.textBox1.Text = "Hello" 
在我的基類

,而不是在每一個cs文件寫它。 顯然,「textBox1」不是我的基類中的已知對象,因爲它沒有附加設計器文件。

可能嗎?

+2

您是否嘗試過使用部分類?這是網頁使用,雖然我沒有嘗試這樣做。最好的方法是讓這兩個代碼可以繼承的服務器控件(所有代碼)。 – ps2goat

+0

@ ps2goat - 你是天才!我正在做一些嘗試,似乎有效 - 我會及時更新,因爲它可能對其他人有所幫助 – LittleSweetSeas

+0

@revisors:這不是一個簡單的從基類繼承的問題(如問題中明確指出的),所以這與其他問題中已經提供的答案不同。我將很快發佈似乎有效的解決方案,這要感謝ps2goat提示 – LittleSweetSeas

回答

3

所以在這裏它是一個完全適合我的需求(再次感謝ps2goat的提示)解決方案。

我的兩頁基本結構是:

[namespace A] 
Page.aspx 
Page.aspx.cs 
Page.aspx.designer.cs 

[namespace B] 
Page.aspx 
Page.aspx.cs 
Page.aspx.designer.cs 

(假設我有遠遠超過2頁)

我需要刪除的.cs和.designer.cs文件,同時能夠引用.aspx頁面中聲明的服務器控件。

從基類繼承的標準,也不使用母版頁,這是不可能的:它們運行良好,但完全不瞭解子ASPX服務器控件。

所以,我創建了一個通用類文件

[namespace COMMON] 
Page.cs 

在這個文件中,我都抄「的.cs」部分類和「了.Designer.cs」的內容部分類(顯然考慮改變護理命名空間添加到新的名稱空間中)(它們在代碼中是相同的)。

在page.aspx文件中,代碼隱藏映射從「Page.aspx.cs」和「A.Page」命名空間更新爲「Page.cs」和「Common.Page」命名空間。

因此,文件從這些改爲:

[Page。ASPX](每個命名空間一個實例)

<%@ Page Title="Page" Language="C#" MasterPageFile="~/Page.Master" AutoEventWireup="true" CodeBehind="Page.aspx.cs" Inherits="Project.A.Page" %> 
<asp:Content ID="ContentB" ContentPlaceHolderID="cBody" runat="server"> 
    <asp:TextBox ID="txbTest" runat="server" MaxLength="75"></asp:TextBox> 
</asp:Content> 

[Page.aspx.cs](每個命名空間一個實例)

namespace Project.A 
{ 
    public partial class Page: BasePage 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      this.txbTest.Text = "Hello"; 
     } 
    } 
} 

[Page.aspx.designer.cs](自動產生每個命名空間,一個實例)

namespace Project.A { 
    public partial class Page{ 
     protected global::System.Web.UI.WebControls.TextBox txbTest;     
    } 
} 

向這些:

[Page.aspx](每個命名空間一個實例)

<%@ Page Title="Page" Language="C#" MasterPageFile="~/Page.Master" AutoEventWireup="true" CodeBehind="Page.cs" Inherits="Project.COMMON.Page" %> 
<asp:Content ID="ContentB" ContentPlaceHolderID="cBody" runat="server"> 
    <asp:TextBox ID="txbTest" runat="server" MaxLength="75"></asp:TextBox> 
</asp:Content> 

[Page.cs](一個單獨的情況,由舊的.cs和.designer文件的內容所做的)

namespace Project.COMMON 
{ 
    public partial class Page: BasePage 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      this.txbTest.Text = "Hello"; 
     } 
    } 

    public partial class Page{ 
     protected global::System.Web.UI.WebControls.TextBox txbTest;     
    } 
} 

然後我刪除了頁面的的.cs和.designer的每個實例。 CS文件,留下一個結構,如我所需要的,如:

~/A/Page.aspx 
~/B/Page.aspx 
~/COMMON/Page.cs 

它的作品就像一個魅力!

最後,我可以說aspx在投影web軟件時仍然是一個選擇,這個項目的MVC移植可以等待。

1

我要說,即使它有可能使事情變得很髒非常。我會用繼承

~/TemplateA/TemplateA.aspx 
~/TemplateB/TemplateB.aspx 
~/TemplateB/Contact.aspx 

其中TemplateA.aspx和TemplateB.aspx繼承Contact.aspx

相關問題