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

时间:2008-08-05 13:52:13

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

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

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

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:1)

如果你已经在改变了ViewState,你也可以使用UpdatePanel。其部分回发自动更新页面的ViewState。

答案 1 :(得分:1)

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

  

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

它只会增加更多的复杂性,减少对您的支持,并使其他人更难以处理您的应用。

答案 4 :(得分:0)

我实际上找到了你提供的这两个链接,但正如所指出的那样,他们只是在描述问题,而不是解决它。博客文章的作者通过使用不同的ViewState提供程序建议了一种解决方法,但不幸的是,在这种情况下不可能......我真的需要单独留下ViewState的细节而只是挂钩正在做的事情外的现成。