2

Web プロジェクトと多数の異なる Web フォームがあり、実質的にすべての異なるクラスが を継承しているとしSystem.Web.UI.Pageます。

Page_Load私は、自分のプロジェクトで使用する任意のページのメソッドで、いくつかのフィールド、メソッド、および発生するいくつかのことがあれば素晴らしいと判断しました。

protectedすぐに、必要なすべてのフィールドとメソッド (レベル付き) を持ち、このクラスを継承する、MasterPage などのクラスを作成することを考えましたSystem.Web.UI.Page

その後、私のプロジェクトのすべてのページは、代わりに MasterPage から継承する必要がありSystem.Web.UI.Pageます。

これは機能しましたが、いくつかの問題がありました。

  1. System.Web.UI.Pageまだ継承しているフォームを簡単に「キャッチ」することはできませんでした。簡単な方法はありますか?

  2. セットアップ方法により、MasterPage の PageLoad は仮想であり、オーバーライドする必要があります。

    protected override void Page_Load(object sender, EventArgs e)
    {
        base.Page_Load(sender, e);
        // rest of stuff for this page...
    }
    

    すべてのページでベース コールを明示的に設定せずに、親のメソッドを常に最初に呼び出す簡単な方法はありますか?

4

2 に答える 2

4

もう 1 つの方法は、Page から継承するスーパー クラスを作成し、独自のイベント ハンドラーを Page イベントに追加することです。1 つのイベントに必要な数のハンドラーをアタッチできることを忘れがちです。

namespace MyProject
{
    public partial class CustomPage: System.Web.UI.Page
    {
         public CustomPage()
         {
            this.Init += new EventHandler(CustomPage_Init);
            this.Load += new EventHandler(CustomPage_Load);
            this.PreRender += new EventHandler(CustomPage_PreRender);
            this.Unload += new EventHandler(CustomPage_Unload);
         }

         protected void CustomPage_Load(object sender, EventArgs e)
         {
            //do stuff
         } 

     ...
    }
}

次に、ページで通常どおりに継承して実行すると、両方のイベントが発生します。

namespace MyProject
{
    public partial class NewPage: CustomPage
    {
        void Page_Load(object sender, EventArgs e)
        {
            //do more stuff
        }
    }
}
于 2012-07-26T18:21:26.653 に答える
2
  1. 検索/置換はあなたの友達です。
  2. 継承クラスでイベント ハンドラーをオーバーライドしないでください。代わりに、ベース ハンドラーをプライベートにして、継承クラスに新しいハンドラーを作成します。または、基本クラスでオーバーライドして、どちらが最初に呼び出されOnInit()たかを気にする必要がないようにします。Page_Load

もう 1 つの完全に異なるソリューションは、ASP.NET マスター ページを使用することです。これは通常、Web アプリケーションのすべてのページでコンテンツを共有するための最良の方法です。

マスター ページは、開発者が既存のコード、テキスト、およびコントロール要素を繰り返しコピーして作成してきた機能を提供します。フレームセットの使用; 共通要素にインクルード ファイルを使用する。ASP.NET ユーザー コントロールの使用。等々。

マスターページ結果のページ構成

于 2012-07-26T18:18:57.727 に答える