2013-08-22 61 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

相关问题