背景:
我有一个页面,其中有各种使用 JavaScript 处理的客户端事件。我想将其中一些事件与服务器端事件“同步”,或者从代码隐藏中调用函数。
我想用 JavaScript 调用的一些函数可能会更改我在页面上的表单中的控件(例如更改文本框值)。它们还可能更改我存储在 ViewState 中的一些值,因为我希望一些值通过回发保持不变。我不想进行完整的回发,并且拥有可以在更新面板中更改的控件。
我目前正在使用 JavaScript 在我的代码隐藏中“调用”函数,方法是单击通过更新面板中的异步回发触发器触发我页面上的部分回发的不可见按钮。
问题:
我的一个客户端事件调用了一个 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 中的序列化对象。
- 有没有更好的方法可以做到这一点?