Javascript 连续部分回发之间的ViewState丢失?

Javascript 连续部分回发之间的ViewState丢失?,javascript,asp.net,postback,viewstate,Javascript,Asp.net,Postback,Viewstate,背景: 我有一个页面,其中使用JavaScript处理各种客户端事件。我想将其中一些事件与服务器端事件“同步”,或者从代码隐藏中调用函数 我想用JavaScript调用的一些函数可能会以我在页面上的形式更改控件(例如更改文本框值)。它们还可能会更改我存储在ViewState中的某些值,因为我希望某些值在回发过程中保持不变。我不想完全回发,并且在更新面板中有可能更改的控件 我目前正在用JavaScript“调用”代码中的函数,方法是单击不可见按钮,通过更新面板中的异步回发触发器触发页面上的部分回发

背景:

我有一个页面,其中使用JavaScript处理各种客户端事件。我想将其中一些事件与服务器端事件“同步”,或者从代码隐藏中调用函数

我想用JavaScript调用的一些函数可能会以我在页面上的形式更改控件(例如更改文本框值)。它们还可能会更改我存储在ViewState中的某些值,因为我希望某些值在回发过程中保持不变。我不想完全回发,并且在更新面板中有可能更改的控件

我目前正在用JavaScript“调用”代码中的函数,方法是单击不可见按钮,通过更新面板中的异步回发触发器触发页面上的部分回发

问题:

我的一个客户端事件调用了一个JavaScript函数,该函数单击了多个不可见按钮(在单击之间会发生客户端事件,这可能会影响代码隐藏函数的行为)。当我让JavaScript单击多个按钮时,对ViewState所做的更改似乎不会持续,只会观察到上次单击所做的更改

示例:

我可能没有很好地解释这一点,所以这里是我所拥有的简化版本(我可以用它重现这个问题)

标记:

问题:

  • 为什么部分回发之间对ViewState的更改会丢失
  • 如何保存部分回发之间的更改?会话变量工作得很好,但我不想使用它们。我也无法将值保存在不可见控件中,因为我实际上正在更改ViewState中的序列化对象
  • 有没有更好的方法可以让我这样做

  • 我可以想象,如果您使用Javascript和页面postsback“按下”两个按钮,那么只有一个服务器端事件处理程序将注册,因此您将只获得一个将触发的单击事件

    我猜页面模型的设计是围绕人与人之间的交互而构建的——人只会点击一个按钮,因此只有一个服务器端点击事件能够被触发。您的方法虽然非常狡猾,但实际上已经破坏了页面模型(按了两个按钮),因此该模型停止运行

    虽然只是在我的脑海里,但对我来说是有意义的

    当我需要JavaScript事件以ViewState类型的方式持久化时,我使用了自己的持久化方法,例如

  • 在窗体上放置一个隐藏字段
  • 当JavaScript启动时,JSON将您想要在对象结构中保持(或对象)的控制状态序列化,这对您来说是有意义的
  • 当页面重新加载时,使用JavaScript(或JQuery等)挑选持久化的JSON字符串。将其返回到一个对象(如果愿意,可以使用JSON解析器或eval),然后使用它重置页面状态
  • 如果您使用javaScript方法,那么这将触发完整和部分回发,这可能对您的情况有用


    只是我的经验。可能对您相关/有帮助

    我可以想象,如果您使用Javascript和页面postsback“按下”两个按钮,那么只有一个服务器端事件处理程序将注册,因此您将只获得一个单击事件

    我猜页面模型的设计是围绕人与人之间的交互而构建的——人只会点击一个按钮,因此只有一个服务器端点击事件能够被触发。您的方法虽然非常狡猾,但实际上已经破坏了页面模型(按了两个按钮),因此该模型停止运行

    虽然只是在我的脑海里,但对我来说是有意义的

    当我需要JavaScript事件以ViewState类型的方式持久化时,我使用了自己的持久化方法,例如

  • 在窗体上放置一个隐藏字段
  • 当JavaScript启动时,JSON将您想要在对象结构中保持(或对象)的控制状态序列化,这对您来说是有意义的
  • 当页面重新加载时,使用JavaScript(或JQuery等)挑选持久化的JSON字符串。将其返回到一个对象(如果愿意,可以使用JSON解析器或eval),然后使用它重置页面状态
  • 如果您使用javaScript方法,那么这将触发完整和部分回发,这可能对您的情况有用


    只是我的经验。可能对您有相关/帮助

    我对此进行了测试,并在部分请求中更新了视图状态。 连续两次部分请求可能有问题。第一个请求必须在第二个请求触发之前返回才能正常工作

    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......