4

マスターページとメインページの両方でポストバックによって更新されるセッションにカスタムオブジェクトがあります。

ポストバックの後、Session オブジェクトを取得し、その一部またはオブジェクト全体を再構築して変更し、Session にロードし直す必要があります。

このコードは、メイン ページの Page_Load に記述しました。1ページだけでうまくいきます。

同じマスターページを使用して別のページを作成したので、以前と同じようにマスターページでセッション オブジェクトを変更できるようにしたいと考えています。

したがって、セッション処理コードをマスターページの Page_Load に移動するだけでよいと考えました。しかし、メイン ページのコントロール (つまり、リピーター) は、マスターページの Page_Load が発生する前に、OnItemDataBound イベントのハンドラーでセッション オブジェクトにアクセスし、この方法ではセッション オブジェクトの以前の状態のみを取得するため、期待どおりには機能しませんでした。 . (メインページのリピーターにのみ当てはまります。マスターページのリピーターは、セッションにアクセスするときに現在の状態を取得します)

マスターページの Page_PreLoad イベントを使用できると思っていても、Page_PreLoad のポストバック データにアクセスして、それに応じてセッション オブジェクトを更新できましたが、マスターページに Page_PreLoad がないことがわかりました。これを使って。

セッションのどこでオブジェクトを更新すればよいですか?

要約すると、ポストバック データを使用する準備ができており、メイン ページとマスターページのリピーターの OnItemDataBound イベントのどちらもまだ発生していない、マスター ページの分離コード内の場所が必要です。

4

4 に答える 4

5

別の解決策もあります。マスターページの init イベントで、ページの preload イベントを実際にサブスクライブできます。マスターページで次のコードを検討してください。

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        Page.PreLoad += OnPreLoad;
    }

    protected void OnPreLoad(object sender, EventArgs e)
    {
        //this function is in the masterpage but will be called on page preload event so do here your preload stuff ...
    }
于 2014-11-10T11:36:48.817 に答える
4

うまくいけば、これを正しく理解できます。あなたの最善の選択肢は、ベース ページを作成し、ページをこれから継承させることだと思います。Page_Loadベース ページのまたはPage_PreLoadイベント ハンドラーにロジックを配置します。マスター ページは、実際のページの読み込みが開始された後に読み込まれます。

したがって、ベース ページを作成します。

public class BasePage : Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
      // sesion logic here
   }  
}

そして、ページをこれから継承させます(マスターページを使用するだけでなく):

public class Page1 : BasePage //instead of Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
      base.Page_Load(sender, e);
   }  
}
于 2011-02-22T11:56:55.273 に答える
2

asp.net フォーラムから:

マスター「ページ」UserControl、実際の によってホストされるPageです。これは、ページのライフサイクルではなく、コントロールのライフサイクルのみを通過することを意味します。

提案されているように、最善のアプローチは基本Pageクラスであるため、ページ間で共通のコードを共有できます。もう 1 つは、クラスRequestでサポートされているイベントの 1 つを使用することです。Application

私は単純にInitイベントを使用することになりました(イベントがないためPreLoad):

protected void Page_Init(object sender, EventArgs e)
{
   if (Request.Params["debug"] != null)
      Page.Trace.IsEnabled = true;
}
于 2012-11-13T21:28:36.797 に答える
1

これを探している場合は、プリロードをオーバーライドすることもできます。

public class BasePage : System.Web.UI.Page
{
    public BasePage()
    {
    }
    protected override void OnPreInit(EventArgs e)
    {
        MasterPageFile = "MasterPage2.master";

    }  
}
于 2014-08-04T07:38:18.120 に答える