使用ASP.NET AJAX/ICallbackEventHandler跟踪状态

vfugit 发布于 2018-02-09 ajax 最后更新 2018-02-09 01:11 933 浏览

我在ASP.NET AJAX页面中维护状态时遇到问题。短版本:我需要一些方法来更新页面ViewState异步回调后,以反映在异步调用服务器进行的任何状态更改。 这似乎是一个常见的问题,但我会描述我的情况来帮助解释: 我有一个类似网格的控件,它具有一些JavaScript增强功能,即拖放列和行的功能。当一个列或行被放到一个新的位置时,调用一个AJAX方法来通知控制服务器端并触发相应的服务器端事件(“OnColumnMoved”或“OnRowMoved”)。 ASP.NET AJAX调用,默认情况下,发送整个页面作为请求。通过这种方式页面经历了一个完整的生命周期,ViewState被持久化,并且在调用RaiseCallbackEvent方法之前,控件的状态被恢复。 但是,由于AJAX调用不会更新页面,因此即使在移动了列或行之后,ViewState也会反映控件的原始状态。因此,第二次客户端动作发生时,AJAX请求发送到服务器和页面<控件再次构建,以反映控件的第一个状态,而不是第一列或行移动后的状态。 这个问题延伸到许多含义。例如,如果我们有一个客户端/ AJAX操作来向网格中添加一个新项目,然后拖动一行,则网格将在服务器端构建,比在客户端少一个项目。 最后&最严重的是我的具体例子,我们正在执行的实际数据源对象存储在页面ViewState。这是一个设计决定,允许保留操作数据的有状态副本,可以在多次操作后将其提交给数据库,或者在用户退出后丢弃。这是很难改变的。 所以,再次,我需要一个方法的页面ViewState在AJAX方法被触发后更新回调。

已邀请:

icum

赞同来自:

看看这篇博文:Tweaking the ICallbackEventHandler and Viewstate。作者似乎正在处理你正在经历的情况:

So when using ICallbackEventHandler you have two obstacles to overcome to have updated state management for callbacks. First is the problem of the read-only viewstate. The other is actually registering the changes the user has made to the page before triggering the callback.
有关如何解决此问题的建议,请参阅博文。另外请查看这个forum post,讨论同样的问题。

vfugit

赞同来自:

我确实发现了你提供的这两个链接,但是正如他们所提到的,他们只是简单地描述了问题,而不是解决问题。博客文章的作者通过使用不同的ViewState提供商提出了一个解决方法,但不幸的是,在这种情况下,这不是一个可能性...我真的需要单独留下ViewState的细节,只是挂钩正在做的事情盒子外面。

hvelit

赞同来自:

如果你已经在改变ViewState,那么你也可以使用UpdatePanel。它的部分回传自动更新页面的ViewState。

vfugit

赞同来自:

我用Telerik's RadAjaxManager发现了一个相当优雅的解决方案。它工作得非常好,基本上你注册了每个可能调用回发的控件,然后在异步执行回发之后注册应该重新绘制的每个控件。 RadAjaxManager将在异步回发之后更新DOM,并重写ViewState和所有受影响的控件。在Reflector中窥视之后,它在引擎盖下面看起来有些诡异,但它适合我的目的。

hvelit

赞同来自:

我不明白为什么你会使用自定义控件,当内置的ASP.NET AJAX UpdatePanel做同样的事情。 它只是增加了更多的复杂性,给你更少的支持,并使其他人更难处理你的应用程序。