asp:UpdatePanel内にあるボタンを取得してページ全体を更新するにはどうすればよいですか?
-
03-07-2019 - |
質問
更新パネル内に、ページ全体を更新するボタンがあります。 ChildrenAsTriggers =" false"
および UpdateMode =" Conditional"
を設定しました。
問題を示すサンプルコードがここにあります。
<asp:UpdatePanel ID="myFirstPanel" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional">
<ContentTemplate>
<asp:Button runat="server" ID="myFirstButton" Text="My First Button" onclick="myFirstButton_Click" />
<asp:Button runat="server" ID="mySecondButton" Text="My Second Button" onclick="mySecondButton_Click" />
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="mySecondPanel" runat="server">
<ContentTemplate>
<asp:Label runat="server" ID="myFirstLabel" Text="My First Label"></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="myFirstButton" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
<asp:Label runat="server" ID="mySecondLabel" Text="My Second Label"></asp:Label>
そしてコードビハインド:
protected void myFirstButton_Click(object sender, EventArgs e)
{
myFirstLabel.Text = "Inside Panel " + DateTime.Now.ToString("mm:ss");
}
protected void mySecondButton_Click(object sender, EventArgs e)
{
mySecondLabel.Text = "Outside Panel " + DateTime.Now.ToString("mm:ss");
}
2番目のボタンがクリックされたときに、更新パネル内にないラベルを更新したい。 2番目のボタンは、更新パネルにある必要があります。ラベルを更新パネルに入れたくありません。
解決
2番目のボタンの最初のUpdatePanelにPostBackトリガーを追加してみてください。これにより、その更新パネル、ボタンが完全なポストバックを行う必要があることがわかります。
他のヒント
ScriptManager.GetCurrent(Page).RegisterPostBackControl(button);あなたの問題を解決します
そのように最初の更新パネルにPostBackTriggerを追加する場合
<Triggers>
<asp:PostBackTrigger ControlID="mySecondButton" />
</Triggers>
これにより、2番目のボタンがクリックされたときに完全なポストバックが発生します。これは私が探していた正確な動作です。
似たようなケースがありましたが、やや複雑ですが、この答えを見つけるのに1日以上かかりました。 (答えは基本的に@serkanによって与えられたものと同じです。ただ拡張しています。)クリックすると画像が生成され、画像のダウンロードがトリガーされるボタンを持つASP.NETユーザーコントロールがありました。 。これは通常のページでは美しく機能しましたが、ユーザーコントロールが更新パネルに埋め込まれているときにはまったく機能しませんでした。特に、ボタンがユーザーコントロール内にあり、それを使用するページからの明白なアクセスがないため、このボタンに対してのみ通常のポストバックを行うように更新パネルに指示する方法がわかりませんでした。
最終的に機能したのは非常に簡単でした。パネルのポストバックトリガーを指定する必要はありませんでした。むしろ、ユーザーコントロールのPage_Loadに次を追加しました:
protected void Page_Load(object sender, EventArgs e)
{
// If the chart is within an update panel then we need to tell the script manager
// to not do an asynch postback on chartdownload. If we don't, the download
// doesn't work.
var scriptManager = ScriptManager.GetCurrent(Page);
if (scriptManager != null)
{
scriptManager.RegisterPostBackControl(ChartSaveButton);
}
// Rest of Page_Load followed here...
さらに、 ChartSaveButton
プロパティを作成して、ボタンのコントロールに簡単にアクセスできるようにします。
private Control ChartSaveButton
{
get { return FindControl("btnDownloadChart"); }
}
(&quot; btnDownloadChart&quot;はボタンのIDです。)
ここまで来るのは苦痛な道でしたが、解決策がとてもエレガントであることに満足しています。これがお役に立てば幸いです。
私にとって、この設定は意味がありません。更新パネルは非常に簡単にajaxのような効果を実現する優れた方法ですが、すべての状況で理想的ではないことに注意してください。
ページアーキテクチャで例のように要素の配置が必要な場合は、javascriptでページまたはサービスメソッドを使用してラベルを更新することをお勧めします。
ラベルが更新パネルにない場合、値を更新する唯一の方法は、通常のポストバックのようにページ全体を更新することです。更新するには、同じページにリダイレクトする必要があります。 ajaxフレームワークは、更新パネルからのリクエストであってもリダイレクトを処理することを知っているので、ボタンのクリックでResponse.Redirect(...)を実行するだけです。