2011-01-26 15 views
5

次のシナリオを実行します。私は複数のASPXページを持っています。ログイン、ログアウト、メイン、メッセージなど...これらはすべてもちろんSystem.Web.UI.Pageから継承しています。すべてのページについて、PageクラスからRenderメソッドをオーバーライドする必要があります。私は簡単にコピー&ペースト同じコードを各ページにそのようにできます。複数のASP.NETページで同じ機能をオーバーライドする方法(レンダリング機能)

protected override void Render(HtmlTextWriter writer) 
{ 
    //Code Logic Here 
} 

をしかし、私は多くのページを持っていた場合、非常に時間がかかり、エラーが発生しやすいを得ることができ、各ページ内のコードを維持し、20を言うことができます。

これは私が少し考えて、私は大丈夫だと思ったと思った...各ページの関数をオーバーライドするが、静的関数を呼び出す。静的関数を変更すると、すべてのページが変更されます。これはうまくいきます...しかし、それは本当に素晴らしく清潔ではなく、すべての単一ページでそのようにオーバーライドする必要があります。誰にもこのアイデアやアイデアはありますか?多分私は見落としているシンプルな何か?ありがとう

EDIT:一部のページはSystem.Web.UI.Pageクラスを使用し、一部のページはSystem.Web.UI.Pageクラスの他の機能を継承して上書きするModifiedPageという別のクラスを継承します。したがって、1つのクラスからすべてのページを継承するほど単純ではありません。

EDIT2:すべてのページがこの動作を必要とします。一部のクラスはすでに別のクラスから派生していますが、他のクラスの実装や継承階層を変更できません。

+3

使用基本クラスから他のすべてのページを継承します。ページを使用してすべてのページに使用します –

+0

編集:一部のページではSystem.Web.UI.Pageクラスを使用し、一部のページではModifiedPageという別のクラスを継承し、System.Web.UI.Pageクラスの他の機能を継承してオーバーライドします。したがって、1つのクラスからすべてのページを継承するほど単純ではありません。 –

+1

改訂版の回答を参照してください。 –

答えて

12

代わりのSystem.Web.UI.Pageから継承し、それらすべてがページから継承MyProject.MyBasePageから継承しています

public abstract class MyBasePage : System.Web.UI.Page 
{ 
    protected override void Render(HtmlTextWriter writer) 
    { 
     //Code Logic Here 
    } 
} 

と...

public partial class MySpecificPage : MyBasePage 
{ 
} 

編集

明確化に追加質問は今本当のパズルを指摘する - この共通Reを必要とするページ論理には異なる継承パスがあります。これはC#ではもっと難解ですが、少なくとも少し冗長な配管コードを避けることはできません。これを処理する方法はたくさんあります。過去に取ったアプローチの1つは、

です。1)この共通機能のためのインターフェイスを作成します。例えば、IOverrideRender

public interface IOverrideRender 
{ 
    void Register(OverrideRender render); 
} 

public delegate void OverrideRender(HtmlTextWriter writer, Action<HtmlTextWriter> original); 

2)この機能は、インターフェースなどのようなワイヤを取得する必要がある各ページ:

public partial class MyPage : Page, IOverrideRender 
{ 
    void IOverrideRender.Register(OverrideRender render) 
    { 
     this.overrideRender = render; 
    } 

    private OverrideRender overrideRender; 

    protected override void Render(HtmlTextWriter writer) 
    { 
     if(overrideRender != nul) 
     { 
      overrideRender(writer, base.Render); 
     } 
     else 
     { 
      base.Render(writer); 
     } 
    } 
} 

3)HttpModuleで、ハンドラがあるかどうかを確認IOverrideRenderその場合はカスタムレンダリングメソッドを渡します。

public class OverrideRenderModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.PreRequestHandlerExecute += this.HandlePreRequestExecute; 
    } 

    private void HandlePreRequestExecute(object sender, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)sender; 
     IOverrideRender overridable = app.Context.CurrentHandler as IOverrideRender; 
     if(overridable != null) 
     { 
      overridable.Register(
       (writer, original) => { 
        writer.Write("Hello world"); //custom write 
        original(writer); //calls base.Render 
      }); 
     } 
    } 
} 
+0

thx Rex ...その醜い笑、しかし、私はいくつかのインターフェイスが必要になるだろうと知っていた。それが動作することを期待する –

1

System.Web.UI.Pageから継承するBasePageを作成する必要があります。 BasePage内では、Renderメソッドをオーバーライドして、すべてのページをBasePageから継承することができます。

1

は、階層内のレベルを追加し、BasePageを作り、そこにあなたのオーバーライドを行う、そしてたSystem.Web.UIから継承BasePage

関連する問題