ASPX页面是否可以共享代码隐藏文件
本文关键字:共享 代码 隐藏文件 是否 ASPX | 更新日期: 2023-09-27 18:28:46
假设我有两个具有相同服务器端控件的ASPX页面。
~/TemplateA/Contact.aspx
~/TemplateB/Contact.aspx
默认情况下,它们被映射到各自的代码隐藏文件。
~/TemplateA/Contact.aspx.cs
~/TemplateB/Contact.aspx.cs
相反,我希望他们指向一个单一的、通用的代码隐藏文件,即
~/Classes/Contact.aspx.cs
我已经让它们继承了一个基本的"Contact"函数类,它公开了整个业务逻辑,但我仍然不知道如何将页面的服务器端控件引用到基本的"Contact"类中;例如,我希望能够写:
this.textBox1.Text = "Hello"
在我的基类中,而不是在每个.cs文件中编写它。显然,"textBox1"在我的基类中不是一个已知的对象,因为它没有附加设计器文件。
有可能吗?
所以这里的解决方案非常适合我的需求(再次感谢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文件中,codebehind映射已从"page.aspx"answers"A.page"命名空间更新为"page:cs"answers"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移植可以等待。
我要说的是,即使有可能,它也会让事情变得非常肮脏。我会使用继承
~/TemplateA/TemplateA.aspx
~/TemplateB/TemplateB.aspx
~/TemplateB/Contact.aspx
其中TemplateA.aspx和TemplateB.aspx继承Contact.aspx