ASPX 页面可以共享文件背后的代码吗?

问题描述 投票:0回答:3

假设我有两个具有相同服务器端控件的 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”不是我的基类中的已知对象,因为它没有附加设计器文件。

可能吗?

c# asp.net .net inheritance
3个回答
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


0
投票

答案=是


快速而肮脏的方法(即复制和粘贴)

  • 步骤 1 | 打开
    Windows Explorer
  • 步骤 2 | 复制原始文件(例如oldy ileyA.aspx)
  • 步骤 3 | 粘贴原文件
  • 第 4 步 | 重命名原始文件(例如oldy ileyB.aspx)
  • 第 5 步 | 编辑新文件

所有这一切的关键是您的

@Page
指令包含:

  1. CodeBehind
    属性;和
  2. Inherits
    属性。

所有这一切的第二个关键是

Windows Explorer
——与
Visual Studio
不同——不会自动生成代码(也不会自动生成任何接线/架构)。因此,您不会遇到编程错误。

所有这一切的第三个关键是认识到您的第二个/复制的文件不需要自己的:

  1. *.aspx.designer.vb
    文件;也不
  2. *.aspx.vb
    文件。

代码实现(我的)

FileyA.aspx

<%@ Page Title="TTT A" Language="vb" CodeBehind="FileyA.aspx.vb" Inherits="StayClassy" %>

FileyB.aspx

<%@ Page Title="TTT B" Language="vb" CodeBehind="FileyA.aspx.vb" Inherits="StayClassy" %>

注意这两个 @Page 指令[实际上]是相同的。

因此,一旦完成了简单的复制和粘贴工作,您就可以继续编辑第二个/复制的文件(即“FileyB.aspx”)。

当然,

.NET
Master Pages
(这可能是更好的选择)


我希望这有帮助。
© www.soinside.com 2019 - 2024. All rights reserved.