我是 WebForms 的新手,我正在尝试理解 ViewState 。 AFAIK今天,它通过回发将UI修改为同一页面。但是为什么它会将状态(=存储的修改)发送到客户端而不会将其保留在服务器上来节省CPU周期和带宽?
我是否完全理解了一些错误?
答案 0 :(得分:3)
视图状态是内在地连接到视图的东西,顾名思义,并试图单独管理它,同时保持这种关系不是一件容易实现的事情。
您需要存储每页的视图状态,因此您仍然必须向客户端发送ID,以便能够在回发时获得正确的视图状态。另一个严重的问题是您向客户端发送了一个页面,但您不知道客户端何时或是否要将该页面回发到服务器,因此您需要至少存储视图状态,直到会话到期为止。
这可能会导致服务器资源的浪费,因为所有这些视图状态都是为可能永远不会回发到服务器的用户存储的。如果你保持你的视野状态苗条,你会同意存放它的最佳位置是发送视图。
最后,如果您对客户端上的视图状态仍然不满意,可以覆盖页面的SavePageStateToPersistenceMedium
和LoadPageStateFromPersistenceMedium
方法并将其保存到其他媒体中。我已经听过很多人抱怨客户端的状态,大多数时候我只是告诉他们继续在服务器上实现持久化到另一种媒体......但是,我相信没有人做过,可能是因为它很复杂你会得到一个不那么干净的解决方案。
答案 1 :(得分:2)
当页面执行回发以便将页面的控制树恢复到上次呈现页面时的状态时,将使用ViewState。
这允许例如GridView控件在帖子后面保持它的状态(GridView中显示的内容),而不必将其重新绑定到相同的数据。
为什么每个默认的ViewState被序列化并发送到客户端的原因是(我猜)这是在客户端执行回发时将其恢复的最简单方法。
例如,如果用户打开了几个浏览器窗口并加载了相同的页面,并且您将视图状态存储在会话中,该怎么办?在这种情况下,将正确的视图状态分配给不同的窗口当然可以解决,但让客户明确发布它似乎是最简单的方法。
也就是说,可以将视图状态存储在Session中。例如,请参阅this link。
通过实施您自己的System.Web.UI.PageStatePersister
可以获得其他可能性。