バックグラウンド:
JavaScriptで処理されるさまざまなクライアント側のイベントがあるページがあります。これらのイベントの一部をサーバー側のイベントと「同期」するか、コードビハインドから関数を呼び出したいと思います。
JavaScriptで呼び出したい関数の中には、ページにあるフォームのコントロールに変更を加える(たとえば、テキストボックスの値を変更する)場合があります。また、いくつかの値をポストバックを通じて保持したいので、ViewStateに保存したいくつかの値を変更する場合があります。完全なポストバックはしたくありません。更新パネルで変更される可能性のあるコントロールがあります。
私は現在、更新パネルの非同期ポストバックトリガーを介してページの部分的なポストバックをトリガーする非表示のボタンをクリックすることにより、コードビハインドで関数を「呼び出し」ています。
問題:
クライアント側のイベントの1つは、複数の非表示のボタンをクリックするJavaScript関数を呼び出します(クライアント側の処理はクリックの間に発生し、コードビハインド関数の動作に影響を与える可能性があります)。JavaScriptで複数のボタンをクリックすると、ViewStateに加えられた変更が保持されていないように見え、最後のクリックからの変更のみが観察されます。
例:
私はこれをあまりよく説明していなかったかもしれないので、ここに私が持っているものの単純化されたバージョンがあります(私はそれで問題を再現することができます)。
マークアップ:
<asp:Button ID="btnA" runat="server" style="display: none;" />
<asp:Button ID="btnB" runat="server" style="display: none;" />
<div style="background: red; width: 100px; height: 100px;" onclick="AB();"></div>
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel runat="server" ID="upForm" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnA" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="btnB" EventName="Click" />
</Triggers>
<ContentTemplate>
</ContentTemplate>
</asp:UpdatePanel>
JavaScript:
function AB() {
$('#<%= btnA.ClientID %>').click();
$('#<%= btnB.ClientID %>').click();
}
コードビハインド:
Protected Sub btnA_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnA.Click
ViewState("AB") += "A"
End Sub
Protected Sub btnB_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnB.Click
ViewState("AB") += "B"
End Sub
質問:
- 部分的なポストバック間のViewStateへの変更が失われるのはなぜですか?
- 部分的なポストバック間の変更を保存するにはどうすればよいですか?セッション変数はうまく機能しますが、私はそれらを使用することに頼る必要はありません。また、ViewStateでシリアル化されたオブジェクトを実際に変更しているため、非表示のコントロールに値を保存することもできません。
- 私がこれを行うことができるより良い方法はおそらくありますか?