【问题标题】:Tracking state using ASP.NET AJAX / ICallbackEventHandler使用 ASP.NET AJAX / ICallbackEventHandler 跟踪状态
【发布时间】:2010-09-05 08:44:41
【问题描述】:

我在维护 ASP.NET AJAX 页面中的状态时遇到问题。简短版本:在进行异步回调后,我需要一些方法来更新页面 ViewState,以反映服务器在异步调用期间所做的任何状态更改。

这似乎是一个常见问题,但我将描述我的场景以帮助解释:

我有一个类似网格的控件,它具有一些 JavaScript 增强功能 - 即拖放列和行的能力。当一列或一行被放到一个新位置时,会调用一个 AJAX 方法来通知控制服务器端并触发相应的服务器端事件(“OnColumnMoved”或“OnRowMoved”)。

默认情况下,ASP.NET AJAX 调用将整个页面作为请求发送。这样页面会经历一个完整的生命周期,视图状态会被持久化,并且控件的状态会在调用 RaiseCallbackEvent 方法之前恢复。

但是,由于 AJAX 调用不会更新页面,因此 ViewState 会反映控件的原始状态,即使在列或行已移动之后也是如此。因此,第二次发生客户端操作时,AJAX 请求会发送到服务器,并且页面和控件会再次备份以反映控件的 first 状态,而不是第一个之后的状态列或行已移动。

这个问题延伸到许多方面。例如,如果我们有一个客户端/AJAX 操作来向网格添加一个新项目,然后拖动一行,则网格是在服务器端构建的,比客户端少一个项目。

最后,对于我的具体示例,最重要的是,我们正在操作的实际数据源对象存储在页面 ViewState 中。这是一个设计决定,允许保留被操纵数据的有状态副本,这些副本可以在多次操作后提交给 DB,或者在用户退出时丢弃。这很难改变。

因此,我需要一种方法,以便在触发 AJAX 方法后在回调中更新页面 ViewState。

【问题讨论】:

    标签: asp.net ajax asp.net-ajax viewstate


    【解决方案1】:

    查看这篇博文:Tweaking the ICallbackEventHandler and Viewstate。作者似乎正在解决您所遇到的情况:

    因此,当使用 ICallbackEventHandler 时,您需要克服两个障碍来更新回调的状态管理。首先是只读视图状态的问题。另一个实际上是在触发回调之前注册用户对页面所做的更改。

    有关如何解决此问题的建议,请参阅博客文章。另请查看forum post,它也讨论了同样的问题。

    【讨论】:

      【解决方案2】:

      我实际上找到了您提供的两个链接,但如前所述,它们只是描述问题,而不是解决问题。博客文章的作者建议使用不同的 ViewState 提供程序来解决此问题,但不幸的是,在这种情况下这是不可能的......我真的需要单独留下 ViewState 的细节,只关注正在做的事情开箱即用。

      【讨论】:

        【解决方案3】:

        如果您已经在调整 ViewState,不妨使用 UpdatePanel。它的部分回发自动更新页面的 ViewState。

        【讨论】:

          【解决方案4】:

          我用Telerik's RadAjaxManager 找到了一个相当优雅的解决方案。它工作得很好。本质上,您注册每个可能调用回发的控件,然后注册每个应该在异步执行回发后重新绘制的控件。 RadAjaxManager 将在异步回发后更新 DOM 并重写 ViewState 和所有受影响的控件。在查看Reflector 之后,它在引擎盖下看起来有点笨拙,但它适合我的目的。

          【讨论】:

            【解决方案5】:

            当内置的 ASP.NET AJAX UpdatePanel 做同样的事情时,我不明白你为什么要为此使用自定义控件。

            它只会增加更多复杂性,为您提供更少的支持,并使其他人更难以使用您的应用程序。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-27
              • 1970-01-01
              • 2012-11-16
              • 2011-11-14
              • 1970-01-01
              • 2015-02-06
              相关资源
              最近更新 更多