4

我对WebForms很陌生,我正在尝试了解ViewState。今天 AFAIK,它通过回发到同一页面来保持对 UI 的修改。但是为什么它将状态(= 存储的修改)发送到客户端并且不将其保存在服务器上以节省 CPU 周期和带宽?

我是否理解完全错误的东西?

4

2 回答 2

3

顾名思义,视图状态是与视图有内在联系的东西,在保持这种关系的同时尝试单独管理它并不是一件容易的事。

您需要存储每个页面的视图状态,因此您仍然必须向客户端发送一个 ID,以便能够在回发时获得正确的视图状态。另一个严重的问题是您向客户端发送了一个页面,但您不知道客户端何时或是否将该页面回发到服务器,因此您需要至少在会话到期之前存储视图状态。

这可能会导致服务器资源的浪费,因为所有这些视图状态都是为可能永远不会回发到服务器的用户存储的。如果您保持视图状态纤细,您会同意存储它的最佳位置是发送视图。

最后,如果您仍然对客户端的视图状态不满意,您可以覆盖页面的SavePageStateToPersistenceMediumLoadPageStateFromPersistenceMedium方法并将其保存到另一个媒体。我已经听到很多人抱怨客户端上的视图状态,大多数时候我只是告诉他们继续在服务器上实现对另一种介质的持久性......但是,我相信没有人做过,可能是因为它很复杂你最终会得到一个不那么干净的解决方案。

于 2012-08-15T09:18:55.887 回答
2

ViewState 在页面执行回发以将页面的控制树恢复到页面最后呈现时的状态时使用。

例如,这允许 GridView 控件在回发时保持其状态(在 GridView 中显示),而无需将其重新绑定到相同的数据。

默认情况下 ViewState 被序列化并发送到客户端的原因是(我猜)这是在客户端执行回发时获取它的最简单方法。

例如,如果用户打开了多个浏览器窗口并加载了相同的页面,并且您将视图状态存储在 Session 中怎么办?在这种情况下为不同的窗口分配正确的视图状态当然可以解决,但是让客户端明确发布它似乎是最简单的方法。

也就是说,可以将视图状态存储在 Session 中。例如见这个链接

通过实现您自己的System.Web.UI.PageStatePersister.

于 2012-08-15T09:37:28.663 回答