除了因为会话存储是多个页面的会话全局,你为什么要使用viewstate来保存值?
从客户端到服务器之间来回发送除了一些小的查询字符串之外的任何类型的信息似乎有点荒谬.我的意思是浪费带宽(!),仅用于存储目的.该会话虽然跨越多个页面,但看起来像是一个完全优于视图状态的替代方案.
特别是对于asp.net ajax控件和变体,viewstate可能很快变得臃肿,跟踪所有这些不同控件和html元素的各种状态和变量.
但那么为什么页面变量和对象的视图存储呢?
也许我错过了该页面的viewstate存储的另一个很好的用法,有没有人知道那里的东西?
谢谢阅读!
编辑:每个人都有一个很好的答案,对不起,如果我没有选择你的.
会话耗尽,Viewstate没有 - 您可以在一小时后返回,您的查看状态仍然可用.当您在网站上返回/转发时,Viewstate也始终可用,会话更改.
Viewstate或Session的全部原因是将Web从无状态系统转变为动态的自定义体验.当用户请求页面时,您可以恢复用户体验的唯一方法是记住服务器上或用户客户端上的状态.
Viewstate是一种用于记住客户端上用户状态的机制.Session是一种用于记住服务器上用户状态的机制.
Viewstate是一种瞬态存储机制.使用viewstate的控件将其状态作为隐藏输入呈现到html页面中.为防止篡改,它已签名.但是,它没有加密,因此您可能希望避免将任何敏感信息放在那里.Viewstate对于您希望发布一系列多个请求(页面加载)的情况非常有用.一个示例是当表单未验证时,因为用户可能输入了错误的电子邮件地址或某些内容,并且您希望恢复用户提交之前的表单.这方面的缺点是viewstate是一个饥饿的野兽,可以轻松添加30-50%的页面大小.
另一方面,会话存储在服务器上.客户端获取一个令牌,告诉服务器哪个内存块是他们的.这比viewstate更安全,因为数据不会一遍又一遍地重新传输给用户.但是有一些权衡取舍.您的服务器可能内存不足.或者,如果用户的会话中断,用户可能会丢失数据.
一般来说,没有"正确"的答案可供使用.这完全取决于你想要实现的目标.
大多数控件应该使用Viewstate.如果您正在处理敏感信息,请考虑会话.如果您拥有适用于特定页面集的数据,请使用viewstate.如果是您在网站上访问整个过程中需要的数据,请参加会议.
例如,当您的应用程序可能正在计算机场中运行而您无法将会话配置为使用sql server时.(或者使用sql server太过性能损失)
ViewState和Session具有不同的范围.ViewState用于在"回发"期间存储或多或少的瞬态数据,而会话用于保存关键会话状态数据.我建议将ViewState用于与特定"页面会话"相关的状态.
如果您不喜欢ViewState的正常行为,那么编写自己的PageStatePersister并让此对象执行持久性非常简单,例如使用会话或Memcached之类的东西.然后,您可以完全覆盖默认的持久性机制.
然后,好处是您可以无缝地继续使用.NET Framework中的标准Web控件,这些控件将全部使用ViewState/ControlState来处理此类数据,而不会使ViewState膨胀.服务器内存持久性机制可能非常有效.