0

同一のサーバー側コントロールを持つ 2 つの 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" はデザイナー ファイルが添付されていないため、基本クラスの既知のオブジェクトではありません。

出来ますか?

4

2 に答える 2

3

したがって、これが私のニーズに完全に適合したソリューションです(ヒントをくれた ps2goat に再び感謝します)。

2 つのページの私の基本的な構造は次のとおりです。

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

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

(私は2ページよりもはるかに多いと仮定します)

.aspx ページで宣言されたサーバー コントロールを参照できるようにしながら、.cs ファイルと .designer.cs ファイルを削除する必要がありました。

これは、基本クラスからの標準の継承やマスター ページの使用では不可能です。それらはうまく機能しますが、子 ASPX サーバー コントロールをまったく認識しません。

だから、私はジェネリッククラスファイルを作成しました

[namespace COMMON]
Page.cs

このファイルでは、元の名前空間のいずれかの ".cs" 部分クラスと ".designer.cs" 部分クラスの両方のコンテンツをコピーしました (明らかに、名前空間を新しい名前空間に変更する必要があります) (コードは同じでした)。 .

page.aspx ファイルでは、分離コード マッピングが "Page.aspx.cs" および "A.Page" 名前空間から "Page.cs" および "Common.Page" 名前空間に更新されました。

したがって、ファイルは次から変更されました。

[Page.aspx] (名前空間ごとに 1 つのインスタンス)

<%@ 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] (名前空間ごとに 1 つのインスタンス)

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

[Page.aspx.designer.cs] (自動生成、名前空間ごとに 1 つのインスタンス)

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

これらに:

[Page.aspx] (名前空間ごとに 1 つのインスタンス)

<%@ 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 ファイルの内容によって作成された 1 つの SINGULAR インスタンス)

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

そして、それは魅力のように機能します!

最後に、web ソフトウェアを投影する場合、aspx はまだ選択の余地があると言えます。このプロジェクトの MVC 移植は待つことができます。

于 2013-08-22T23:01:39.447 に答える
1

たとえそれが可能であったとしても、物事を非常に汚すことになるだろう . 継承を使用します

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

ここで、TemplateA.aspx と TemplateB.aspx は Contact.aspx を継承します。

于 2013-08-22T22:31:13.107 に答える