【问题标题】:Can ASPX pages share code behind file?ASPX 页面可以共享文件后面的代码吗?
【发布时间】:2013-08-25 20:31:20
【问题描述】:

假设我有两个具有相同服务器端控件的 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 - 你真是个天才!我正在尝试,它似乎有效 - 我会及时通知您,因为它可能对其他人也有帮助
  • @revisors:这不是从基类简单继承的问题(正如问题中明确指出的那样),因此它与其他问题中已经提供的答案不同。感谢 ps2goat 提示,我将很快发布似乎有效的解决方案
  • 我认为母版页在这里会很有用。
  • @LittleSweetSeas 就像 Garrison 所说的那样……从您的示例看来,您只是在尝试在模板之间切换……您可以使用母版页和主题来执行此操作。 + 用户控制要容易得多。

标签: c# asp.net .net inheritance


【解决方案1】:

所以这里的解决方案非常适合我的需求(再次感谢 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](一个 SINGULAR 实例,由旧 .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移植可以等。

【讨论】:

    【解决方案2】:

    我要说的是,即使它可能会让事情变得非常脏。我会使用继承

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多