代码改变世界

控件 ViewState 属性的值保存去哪里了

  Cat Chen  阅读(2547)  评论(2编辑  收藏  举报

 

看过MSDN的都知道,存取ViewState有两种方法:

  • 直接操作控件的ViewState属性,通过this.ViewState[key]就可以直接进行读写。
  • 重写控件的LoadViewState和SaveViewState方法。在LoadViewState中系统会将此控件以ViewState保存的信息作为一个object类型参数传入,控件需要自己将信息unboxing出来。在SaveViewState中,控件需要自己将想通过ViewState保存的信息boxing到一个object里面,然后return给系统。

那么到底这两种方法读写ViewState有什么不同呢?

使用Reflector看看Control的LoadViewState与SaveViewState方法你就会发现,其实控件的ViewState属性也就是一个特殊的控件属性,类型为StateBag,由于Control已经为你写好了将StateBag存取到真正的ViewState的方法,所以只要你继承Control控件你就可以放心地把值存到StateBag里面去,而这些值最终会保存到真正的ViewState中。

就这么简单?还差一点,就是StateBag这个字典的每一个项目类型为StateItem,而StateItem有一个IsDirty的属性。只有这个属性为true的StateItem才会被保存到ViewState中。我们在OnInit之后使用this.ViewState[key]读写时该属性都为true,所以StateItem都会被保存。但如果你想要某个StateItem临时不保存到ViewState,那就可以执行this.ViewState.SetItemDirty(key, false)。例如我们熟悉的TextBox,在它的TextBoxMode为Password时它就会通过上述方式让this.ViewState["Text"]值不保存到真正的ViewState中,也就确保了你无法通过ViewState窃取密码,同时也导致了该TextBox的OnTextChanged事件无法正常触发。

那还有什么要说的吗?要说明的就是StateBag的存取所受到的限制。StateBag的存取,与你手动重写LoadViewState/SaveViewState保存的其它值一样,在LoadViewState之前StateBag并没有任何值,在SaveViewState后的任何更新不保存到ViewState中。

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示