2010-11-29 9 views
1

更新パネル内のリンクボタンからページ全体のポストバックを条件付きでトリガするにはどうすればよいですか?更新パネル内のリンクボタンからページ全体のポストバックを条件付きでトリガする

私は独自のupdatepanelとその内部にリンクボタンがネストされたカスタムコントロールを持っています。リンクボタンが押されたとき、私はそのイベントハンドラに、通常のようにコントロールの更新を許可するか、またはページの完全なポストバックを行うかのいずれかのオプションを持たせます。

Page 
    Custom Control 
    UpdatePanel 
     LinkButton 

イベントハンドラ擬似コード:

LinkButton Click Handler Begin 
    If is a partial post back AND a full postback is needed 
     Page.DoFullPostback 
    End If 
End Handler 

注:ここでは

はコントロール階層である私遠かっが起こるために、部分ポストバックを必要としています。コントロールのマークアップに__DoPostbackを注入することを検討していましたが、これは私にとってはハッキリです。

ありがとうございました!

答えて

4

私の例のソースはC#で記述されますので、申し訳ありませんが、私は、VBに精通していないよ:主なアイデアは、あなたのLinkButtonのポストバックの種類を変更することである

protected void btnLink_Click(object sender, EventArgs e) 
{ 
    bool isAsync = ScriptManager.GetCurrent(Page).IsInAsyncPostBack; 
    bool postBackIsNeeded = true; 

    if (isAsync && postBackIsNeeded) 
    { 
     ScriptManager.GetCurrent(Page).RegisterPostBackControl(btnClick); 
     string postback = Page.ClientScript.GetPostBackEventReference(
      btnClick, 
      string.Empty 
     ); 
     ScriptManager.RegisterStartupScript(
      btnClick, 
      btnClick.GetType(), 
      "postback", 
      postback, 
      true 
     ); 
} 

}

コントロール。必要な場合は、非同期ポストバックイベント中に部分的ではなく完全ポストバックに変更する必要があります。この直後に別のポストバックスクリプトを生成し、ページがクライアントに返されるとすぐに実行する必要があります。

最後に、ループ検出条件(私の場合はif (isAsync && postBackIsNeeded))を使用してください。それ以外の場合、ポストバックは無限になります。

+0

私が持っていた問題にはこれが必要でした。 ViewStateオブジェクトに基づいてPage_Loadのコントロールを動的に生成しています。ただし、ビューステートオブジェクトは、ボタンクリックイベントハンドラで更新または変更されます。ページのライフサイクルによると、button_clickイベントハンドラはbutton_clickポストバックの後に実行されるので、viewstateは基本的にはそれが使用されているpage_loadの後に更新されています。 button_clickでこのコードを使用して別のポストバックを引き起こし、page_loadを再度実行させました。また、if文の中にviewstateの変更コードを入れます。共有ありがとう! – Mausimo

+0

もう一度ポストバックせずに、非同期ポストバック内からページ全体をレンダリングする方法はありませんか?これは多くの人に望ましくないことが起こっているように思われるので、私はその行動を動的に引き起こす方法もあると思っています。 – Oliver

1

最も簡単な方法は、UpdatePanelsの外にページのどこかに隠しボタンを作成することです。完全なポストバックが必要な場合は、JavaScriptを使用してボタンをクリックするか、__doPostback()を発行します。 UpdatePanel自体で__doPostback()を呼び出したり、UpdatePanel内のボタンに__doPostback()を呼び出すことで、JavaScriptでプログラム的に部分的なポストパックを実現することができます。

関連する問題