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

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

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

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

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

这个问题涉及很多方面。例如,如果我们有一个客户端/AJAX 操作来向网格添加一个新项目,然后拖动一行,则网格将在服务器端构建,并且比客户端少一个项目。

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

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

有帮助吗?

解决方案

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

其他提示

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

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

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

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

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

我不明白为什么当内置 ASP.NET AJAX UpdatePanel 执行相同的操作时,您要使用自定义控件。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top