javascript - ViewState 在连续的部分回发之间丢失?

标签 javascript asp.net postback viewstate

背景:

我有一个页面,其中有各种使用 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

问题:

  1. 为什么部分回发之间对 ViewState 的更改会丢失?
  2. 如何保存部分回发之间的更改? session 变量效果很好,但我宁愿不必诉诸于使用它们。我也无法将值保存在不可见控件中,因为我实际上是在更改 ViewState 中的序列化对象。
  3. 我是否有更好的方法来执行此操作?

最佳答案

我对此进行了测试, View 状态确实会根据部分请求进行更新。 2 个连续的部分请求可能存在问题。第一个请求必须在第二个请求触发之前返回才能工作。

viewstate 的工作方式是有一个名为 __VIEWSTATE 的隐藏字段,它会在每个请求上发布。 ASP.NET 使用此数据来维护它需要的任何状态。 因此,如果第一个请求尚未返回到浏览器并且浏览器中的 View 状态尚未更新,则不会在第二个请求中发送。

更新面板的响应看起来像这样:

248|updatePanel|ctl00_ContentPlaceHolder1_up|
.......
__VIEWSTATE|/wEPDwUKLTM1OTc4......

然后在客户端更新 View 状态。 我会在第二次请求之前检查它是否正在更新。

话虽如此,我认为使用更新面板有点过时了。如果我是你,我会使用 javascript 和 webmetods。看看this .当然,这取决于具体情况。在我看来,您使用的方法是肮脏且不清楚的。

关于javascript - ViewState 在连续的部分回发之间丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11085096/

相关文章:

c# - 带有 C# 的 ASP.net 在回发时保留列表

c# - 回发后如何在 gridview 上保留颜色? ASP.NET C#

javascript - jQuery 类选择器 vs 缓存元素 + 查找

asp.net - 覆盖母版页上控件中的功能

javascript - 需要帮助/Off-Canvas Flexbox 菜单切换/z-index

php - 使用 .NET 在 SugarCRM 中实现 oauth

asp.net - SessionID 在 Azure 中的不同实例中发生变化(可能在网络场中)

asp.net - 回发后如何从 jQuery 模式对话框中获取文本框值?

javascript - Jquery 使用 select LI 改变文本的值

javascript - 如何在单击按钮时在angularjs中动态添加输入字段?