我在维护ASP.NET AJAX页面中的状态时遇到了问题。简短版本:在异步回调之后,我需要一些方法来更新页面ViewState,以反映服务器在异步调用期间所做的任何状态更改。
这似乎是一个常见的问题,但我将描述我的场景,以帮助解释:
我有一个类似网格的控件,它具有一些JavaScript增强功能,即能够拖放列和行。当将列或行放到新位置时,会调用AJAX方法通知控件服务器端,并触发相应的服务器端事件("OnColumnMoved“或"OnRowMoved")。
默认情况下,ASP.NET AJAX调用将整个页面作为请求发送。这样,页面就会经过一个完整的生命周期,viewstate被持久化,并且控件的状态在调用RaiseCallbackEvent方法之前被恢复。
但是,由于AJAX调用不更新页面,所以ViewState反映了控件的原始状态,即使在移动了列或行之后也是如此。因此,当第二次发生客户端操作时,AJAX请求将转到服务器,页面和控件将再次生成,以反映控件的第一种状态,而不是第一列或行被移动后的状态。
这个问题涉及到许多方面。例如,如果我们有一个客户端/AJAX操作来向网格中添加一个新项,然后拖动一行,那么网格将被构建为服务器端,其项比客户端少一个。
最后&对于我的具体示例来说,最重要的是,我们正在处理的实际数据源对象存储在页面ViewState中。这是一个允许保留被操纵数据的有状态副本的设计决定,这些数据可以在多次操作后提交到DB,或者如果用户退出,则被丢弃。这是很难改变的。
因此,在激发AJAX方法之后,我同样需要一种在回调中更新页面ViewState的方法。
发布于 2008-08-07 16:19:34
如果您已经对ViewState进行了调整,那么最好使用UpdatePanel。它的部分回发将自动更新页面的ViewState。
发布于 2008-08-05 14:25:19
查看这篇博文:调整ICallbackEventHandler和视图状态。作者似乎是在讨论你们正在经历的情况:
因此,在使用ICallbackEventHandler时,需要克服两个障碍,才能更新回调的状态管理。首先是只读视图状态的问题.另一个是在触发回调之前,实际注册用户对页面所做的更改。
有关如何解决这一问题的建议,请参见博客帖子。还可以查看这个论坛帖子,它也讨论了同样的问题。
发布于 2008-08-05 14:54:23
实际上,我发现了您提供的这两个链接,但正如前面提到的,它们只是简单地描述问题,而不是解决问题。这篇博客文章的作者建议通过使用不同的ViewState提供者来解决问题,但不幸的是,在这种情况下,这是不可能的.我真的需要把ViewState的细节放在一边,只需要直接连接到正在做的事情上。
https://stackoverflow.com/questions/2328
复制相似问题