23

假设您有一个不依赖会话的 aspx 页面,但确实依赖于视图状态来实现回发之间的持久性。

如果一个用户正在访问这个页面,并且离开了一个很长的午餐,当他返回时视图状态仍然有效吗?

4

12 回答 12

14

Viewstate 本身不会过期。由于它以表格形式发布,因此可以随时重新构建。

根据 MSDN:“ ..如果页面未在会话到期时间内回发,则视图状态可能会到期”。因此,以某种方式,如果您的会话过期,它可能会过期,但视图状态不会直接过期。由于您无论如何都没有使用会话状态,因此您不必担心隐式过期。

请注意,我不会说它已过期。那是我在他们自己的题为控制 ViewState的文章中引用的 MS

于 2008-10-24T14:49:13.927 回答
9

没有 ViewState 被保留为 PostBack 过程的一部分。但是,如果需要,您可以覆盖Page 类的 SavePageStateToPersistenceMedium() 和 LoadPageStateFromPersistenceMedium() 以实现该行为。有关详细信息,请阅读了解 ASP.NET ViewState

请注意,Page ViewState 存储在 Session 中,因此如果您的 Session 过期,ViewState 将丢失。我不会说这是 ViewState 到期,但是是的,它会在 Session 超时后被销毁。

于 2008-10-24T14:48:06.253 回答
5

Viewstate 不会过期。

所有视图状态数据都存储在客户端上,并在用户执行回发时提交回服务器。

这有一些非常有趣的含义,在这里进行了非常彻底的解释。

于 2008-10-24T14:51:14.390 回答
5

此外,作为一个陷阱,默认情况下 ASP.NET 使用自动生成的密钥加密 ViewState。这可以用 web.congif 文件中的 MachineKey 元素覆盖。即使 ViewState 不会过期,但如果使用不同的自动生成的密钥来解密 ViewState,例如在 IIS 重置、重新部署应用程序或访问 Web 场中的不同服务器之后,它可能会变得无效。如果您计划长时间存储视图状态,请注意它是如何加密/解密的。

http://msdn.microsoft.com/en-us/library/ms998288.aspx

于 2008-10-24T14:58:31.287 回答
5

是的,ViewState 在某些情况下会过期。例如,当您使用 iframe:s 时,或者当您通过定期回发保持与服务器的“实时”连接时。然后你可能想研究这个选项:<sessionPageState historySize="9"/>,它实际上硬编码了 Session 中存储了多少“回发结果”(如果使用 SessionPageStatePerster)。每个回发将其 ViewState 存储到 Session["__VIEWSTATEQUEUE"] 中的队列末尾,并删除“太旧”的 ViewState。你认为 SessionPageStatePerster 如何决定哪些 ViewStates 太旧了.. 通过在 web.config 中配置一些任意的 historySize-constant .. Omg!我也永远找不到这个问题...我对 asp.net 编程的仇恨现在无法形容.. grrr ...

于 2011-03-21T12:24:56.233 回答
2

Viewstate 不会过期,只要它们还在页面上,它就仍然存在并且可以正常工作。

于 2008-10-24T14:49:44.470 回答
2

ViewState 将从 POST 持续到 POST。它实际上存储在表单上的隐藏字段中,因此它一直被 POST 回您的服务器。

只要您不依赖 Session 重建页面状态就不应该有任何问题。不过,如果您愿意,可以很容易地测试页面的状态代码:只需在 web.config 中将会话设置为 60 秒后过期,然后加载页面,等待一分钟多一点(浏览 Stack Overflow 并回答一些问题)然后单击页面上的按钮。

于 2008-10-24T14:54:17.487 回答
2

很抱歉重温这个旧线程,但现在有新信息可用:

是的,ViewStates expires。我花了 19 个小时研究 ViewStates 在长时间间隔回发之间丢失其值的问题。我花了一段时间阅读 MSDN 文档和 Stackoverflow 的回答,说除非采用自定义 ViewState 存储实现,否则基本上不可能发生,现在我知道,这不是真的。

我的问题发生在 SharePoint 2013 环境中。称为分布式缓存(又名AppFabric)的服务会缓存 ViewState 并具有与之关联的生存时间。您可以在此处找到更多信息:http: //blogs.msdn.com/b/besidethepoint/archive/2013/03/27/appfabric-caching-and-sharepoint-1.aspx

可以在以下短语中找到有趣的信息: “为了提高页面性能,从 SharePoint 2013 开始,SharePoint 会在服务器端缓存 ViewState 数据,而不是将其来回传输到客户端。”

我希望这些信息可以帮助像 19 小时前一样绝望的人。

于 2014-06-20T05:17:04.217 回答
1

ViewState 保存在页面本身的隐藏字段中。因此,只要用户拥有该页面,他就会拥有 ViewState。但是,如果您的应用程序在一段时间后自动将用户注销,那么仍然拥有 ViewState 可能对他没有任何好处。

于 2008-10-24T14:51:46.400 回答
1

默认情况下,Viewstate 作为隐藏输入包含在 html 内容中。这意味着它不会过期,但视图状态中的所有内容都必须从用户的浏览器上传。由于这通常是公共站点中连接速度最慢的部分,因此在视图状态中放置大量内容会很快使您的站点看起来很慢。

于 2008-10-24T14:51:51.317 回答
1

最简洁的答案是不。

更长的答案是:这取决于 ViewState 存储的实现。您可以提供 ViewState 的自定义实现,该实现可能会在给定的时间后过期。例如,您可以将 ViewState 存储在数据库或磁盘上,并仅发送对隐藏字段中存储值的一些引用。然后,您可以使用批处理来删除过时的 ViewState 数据或根据请求执行过期。

于 2008-10-24T14:51:53.873 回答
0

没有视图状态不会过期。重定向到其他页面后,视图状态的值会丢失或视图状态过期。更多详情http://www.c-sharpcorner.com/UploadFile/78d182/Asp-Net-state-management-techniques/

于 2015-09-18T11:39:17.763 回答