Javascript 连续部分回发之间的ViewState丢失?
背景: 我有一个页面,其中使用JavaScript处理各种客户端事件。我想将其中一些事件与服务器端事件“同步”,或者从代码隐藏中调用函数 我想用JavaScript调用的一些函数可能会以我在页面上的形式更改控件(例如更改文本框值)。它们还可能会更改我存储在ViewState中的某些值,因为我希望某些值在回发过程中保持不变。我不想完全回发,并且在更新面板中有可能更改的控件 我目前正在用JavaScript“调用”代码中的函数,方法是单击不可见按钮,通过更新面板中的异步回发触发器触发页面上的部分回发 问题: 我的一个客户端事件调用了一个JavaScript函数,该函数单击了多个不可见按钮(在单击之间会发生客户端事件,这可能会影响代码隐藏函数的行为)。当我让JavaScript单击多个按钮时,对ViewState所做的更改似乎不会持续,只会观察到上次单击所做的更改 示例: 我可能没有很好地解释这一点,所以这里是我所拥有的简化版本(我可以用它重现这个问题) 标记: 问题:Javascript 连续部分回发之间的ViewState丢失?,javascript,asp.net,postback,viewstate,Javascript,Asp.net,Postback,Viewstate,背景: 我有一个页面,其中使用JavaScript处理各种客户端事件。我想将其中一些事件与服务器端事件“同步”,或者从代码隐藏中调用函数 我想用JavaScript调用的一些函数可能会以我在页面上的形式更改控件(例如更改文本框值)。它们还可能会更改我存储在ViewState中的某些值,因为我希望某些值在回发过程中保持不变。我不想完全回发,并且在更新面板中有可能更改的控件 我目前正在用JavaScript“调用”代码中的函数,方法是单击不可见按钮,通过更新面板中的异步回发触发器触发页面上的部分回发
我可以想象,如果您使用Javascript和页面postsback“按下”两个按钮,那么只有一个服务器端事件处理程序将注册,因此您将只获得一个将触发的单击事件 我猜页面模型的设计是围绕人与人之间的交互而构建的——人只会点击一个按钮,因此只有一个服务器端点击事件能够被触发。您的方法虽然非常狡猾,但实际上已经破坏了页面模型(按了两个按钮),因此该模型停止运行 虽然只是在我的脑海里,但对我来说是有意义的 当我需要JavaScript事件以ViewState类型的方式持久化时,我使用了自己的持久化方法,例如
只是我的经验。可能对您相关/有帮助我可以想象,如果您使用Javascript和页面postsback“按下”两个按钮,那么只有一个服务器端事件处理程序将注册,因此您将只获得一个单击事件 我猜页面模型的设计是围绕人与人之间的交互而构建的——人只会点击一个按钮,因此只有一个服务器端点击事件能够被触发。您的方法虽然非常狡猾,但实际上已经破坏了页面模型(按了两个按钮),因此该模型停止运行 虽然只是在我的脑海里,但对我来说是有意义的 当我需要JavaScript事件以ViewState类型的方式持久化时,我使用了自己的持久化方法,例如
只是我的经验。可能对您有相关/帮助我对此进行了测试,并在部分请求中更新了视图状态。 连续两次部分请求可能有问题。第一个请求必须在第二个请求触发之前返回才能正常工作 viewstate的工作方式是有一个名为u_viewstate的隐藏字段,它会在每个请求上发布。ASP.NET使用此数据来维护其所需的任何状态。 因此,如果第一个请求没有返回到浏览器,并且视图状态没有在浏览器中更新,则不会在第二个请求中发送 更新面板响应如下所示:
248|updatePanel|ctl00_ContentPlaceHolder1_up|
.......
__VIEWSTATE|/wEPDwUKLTM1OTc4......
然后在客户端更新viewstate。
我会在第二次请求之前检查它是否已更新
尽管如此,我认为使用更新面板有点过时。如果我是你,我会使用javascript和webmetods。看一看。当然,这取决于具体情况。在我看来,您使用的方法是肮脏和不清楚的。我已经测试过了,视图状态确实会在部分请求中得到更新。 连续两次部分请求可能有问题。第一个请求必须在第二个请求触发之前返回才能正常工作 viewstate的工作方式是有一个名为u_viewstate的隐藏字段,它会在每个请求上发布。ASP.NET使用此数据来维护其所需的任何状态。 因此,如果第一个
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
248|updatePanel|ctl00_ContentPlaceHolder1_up|
.......
__VIEWSTATE|/wEPDwUKLTM1OTc4......