13

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

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

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

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

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

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

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

因此,再次,我需要一种方法来在触发 AJAX 方法后在回调时更新页面 ViewState。

4

5 回答 5

2

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

于 2008-08-07T16:19:34.683 回答
1

查看这篇博文:调整 ICallbackEventHandler 和 Viewstate。作者似乎正在解决您遇到的情况:

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

有关如何解决此问题的建议,请参阅博客文章。另请查看此论坛帖子,其中也讨论了相同的问题。

于 2008-08-05T14:25:19.750 回答
0

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

于 2008-08-05T14:54:23.670 回答
0

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

于 2008-08-08T04:18:51.737 回答
0

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

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

于 2008-08-08T04:56:31.880 回答