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

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

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

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

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

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

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

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

===============>>#1 票数:2 已采纳

如果您已经在整个ViewState中进行了洗牌,那么您也可以使用UpdatePanel。 它的部分回发自动更新页面的ViewState。

===============>>#2 票数:1

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

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

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

===============>>#3 票数:0

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

===============>>#4 票数:0

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

===============>>#5 票数:0

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

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

  ask by Rex M translate from so

未解决问题?本站智能推荐: