1

EventHandler で preserveForm が true の Server Transfer は、そのイベント Handler を再起動し、無限ループを引き起こします。MY QUESTION: イベントが処理されたことをハンドラーでどのように示すことができますか。

PS: preserveForm を false に設定できることはわかっていますが、そうしたくありません。

サンプルコード:

protected void rbThemes_SelectedIndexChanged(object sender, EventArgs e)
{
    Server.Transfer(Request.FilePath, true); 
}
4

1 に答える 1

0

私が今直面している素晴らしい質問です。答えもわかりません。Request.Formデータを変更してイベントを削除すると思いますが、これをきれいに行う方法はわかりません。

回避策として、同様に保持されている でガード フラグを使用Context.Itemsします。

protected void rbThemes_SelectedIndexChanged(object sender, EventArgs e)
{
    if (IsSecondPass()) return;
    Server.Transfer(Request.FilePath, true); 
}

private bool IsSecondPass()
{
    const string key = "SECOND_PASS_GUARD";
    if (Context.Items[key] == null)
    {
        Context.Items[key] = new object();
        return false;
    }
    else
    {
        Context.Items.Remove(key);
        return true;
    }
}

これはお勧めしませんが、うまくいきます。(メソッド名も、副作用があるためあまり選ばれていません。)

より短い方法もあります:

protected void rbThemes_SelectedIndexChanged(object sender, EventArgs e)
{
    if (PreviousPage != null) return;
    Server.Transfer(Request.FilePath, true); 
}

SelectedIndexChanged他の種類のクロスページ投稿を行っても、望ましくない影響がないことに注意してください (ただし、別のページからイベントをクロス投稿する理由や方法はわかりません)。まだお勧めしません。

注: マスター ページをコーディングしている場合は、マスター ページ クラス ( )PreviousPageのプロパティから参照する必要があります。PagePage.PreviousPage

于 2014-06-23T09:00:29.363 に答える