2

Web を検索した結果、更新によってデータベース アクセスがトリガーされないようにする良い方法は、ViewState 変数と Session 変数を使用して状態を検出することであるという強いコンセンサスがあるようです。私のベースページクラスのコードは次のとおりです。

    protected override void OnLoad( EventArgs e )
    {
        base.OnLoad( e ); 

        if ( IsPostBack && ViewState["REFRESH_CHECK"] != Session["REFRESH_CHECK"] )
        {
            IsRefresh = true;
        }
        Session["REFRESH_CHECK"] = System.Guid.NewGuid().ToString();
        ViewState["REFRESH_CHECK"] = Session["REFRESH_CHECK"];
    }

    public virtual bool IsRefresh
    {
        get;
        private set;
    }

したがって、私のページには次のようなコードがあります。

    protected void Page_Load( object sender, EventArgs e )
    {
        if ( !IsPostBack )
        {
            if ( !IsRefresh )
            {
                doStuffThatShouldOnlyBeDoneOnce();
            }
        }
    }

これはデバッグ中は完全に機能しますが、実稼働システムで実行すると、常に doStuff...() メソッドが 2 回呼び出されます。もちろん、デバッグするときは、呼び出しは 1 つしかありません。

関連する場合と関連しない場合がありますが、ネストされたマスターページも使用しています。

何か案は?

4

2 に答える 2

0

中途半端

Page_Load() が実稼働環境で 2 回呼び出され、デバッグ モードで 1 回だけ呼び出される理由を理解できませんでした。

DB を 2 回ヒットする更新に関する手法も、私にとってはうまくいきませんでした。

そこで私が取ったアプローチは、仕事が行われている場所を変えることでした。新しいページが読み込まれるときにコードを実行する代わりに、リダイレクトの前にボタン コントロールが押されたときに、ボタン コントロールのデリゲートでコードを実行しました。

delegate( Object o, EventArgs eventArgs ) 
{
    doStuffHere();
    HttpContext.Current.Response.Redirect( "admin/Admin.aspx", false );
}

この場合、次のページでは、前のページに基づいてセットアップを行う必要があります。これをすべてのリダイレクトの前に置く限り、すべて問題ありません。これは、ユーザーが URL に直接アクセスした場合には機能しませんが、この特定の状況では問題ありません。ページが完全に読み込まれるわけではありませんが、エラーは発生せず、ユーザーは引き続き作業を行うことができます。

于 2012-10-19T18:29:55.923 に答える