web-dev-qa-db-ja.com

UpdatePanelがページ全体のポストバックを引き起こさないようにするにはどうすればよいですか?

.NET 3.5を使用しており、Community Server2008フレームワーク内でページを構築しています。

あるページで、UpdatePanelを機能させようとしています。

ASP.NET Webサイトから直接サンプルを取得しましたボタンをクリックしてUpdatePanelの時刻を現在の時刻に更新しますしかし、何らかの理由で関数を実行しようとすると、ページ全体が更新されます。

これが私が持っているものです:

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = "Panel refreshed at " + DateTime.Now.ToString();
    Label2.Text = "Panel refreshed at " + DateTime.Now.ToString();
}
<asp:ScriptManager ID="ScriptManager1" runat="server"/>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <fieldset>
            <legend>UpdatePanel</legend>
            <asp:Label ID="Label1" runat="server" Text="Panel created."></asp:Label><br />
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        </fieldset>
    </ContentTemplate>
</asp:UpdatePanel>

ボタンをクリックするたびに、パネルが更新されることを確認してください。ただし、ページ全体が投稿されます。ページ全体が点滅しているのがわかります。私は一体何を間違っているのですか?

ネストされたマスターページ内にいますが、これが問題かどうかはわかりません。私が使用しているこのコミュニティサーバーフレームワークに、すべてのイベントをポストバックさせる何かがあるでしょうか?

14
user53885

[トリガー]セクションでButton1AsyncPostBackTriggerとして設定してみましたか? ChildrenAsTriggersプロパティをtrueに設定し、UpdateModeプロパティをConditionalに設定します。

protected void Button1_Click(object sender, EventArgs e)
{    
    Label1.Text = "Panel refreshed at " + DateTime.Now.ToString();    
    UpdatePanel1.Update();
}    
<asp:ScriptManager ID="ScriptManager1" runat="server"/>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="true" UpdateMode="Conditional">
    <Triggers>        
        <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />    
    </Triggers>    
    <ContentTemplate>        
        <fieldset>            
            <legend>UpdatePanel</legend>            
            <asp:Label ID="Label1" runat="server" Text="Panel created."></asp:Label><br />            
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />        
        </fieldset>    
    </ContentTemplate>
</asp:UpdatePanel>
20

上記のコードサンプルにLabel2が表示されていません。 Label2がUpdatePanelの外部にある場合、ページがLabel2を適切に更新するために必要なため、ページ全体が更新されます。

デフォルトでは、UpdatePanelsは、内部のコントロールによってトリガーされた場合にのみ、内部のコンテンツを動的に更新します。パネルの外側にあるボタンを使用して更新を行ったり、別のパネルのラベルを更新したりするなど、より高度な更新を行う必要がある場合は、UpdatePanelでConditional属性を設定し、手動で更新を呼び出す必要があります。あなたのコードで。

6
Dillie-O

もう1つの考えられる理由は、ページにClientIDMode="static"がある場合、UpdatePanelだけを更新する予定のコントロールがページ全体を更新することです。

この問題を修正するには、UpdatePanelのポストバックをトリガーするコントロールにClientIDMode="AutoID"を設定する必要があります。

3
Mike Beaton

「デフォルトでは、UpdatePanelsは、内部のコントロールによってトリガーされた場合にのみ、内部のコンテンツを動的に更新します。」

そうしないと、ページ全体が更新されます。それがポイントです!

2
Gerhard Meyer

セットする ChildrenAsTriggers="true"UpdatePanelコントロール上。

2
Rex M

.net Framework v1.1からアップグレードされた古いプロジェクトがある場合は、Web構成から次の行を削除して機能させます。

<xhtmlConformance mode="Legacy"/>
0
Alan