浅谈 ViewState

   让我们先把ViewState暂且放在一边,从asp.net中状态(信息)保持方案先聊起吧!

   在asp.net中状态信息保持方案分一般为服务器端和客户端,其中 服务端有Session,Application Object,Cacheing,DataBase,而在客户端有 ViewState,Hidden Field,Cookies,Control State 以及 URL中的Query String。服务器器端的状态信息保持方案 我在这就不谈了,只谈客户端的。

   虽然客户端中将ViewState与 Hidden Field 分开成两种,但我认为他们两个本质上却是相同的,都属于隐藏域Hidden Field,这是因为 在浏览器中 ViewState 会被浏览器解析为 

<input

type="hidden"

name="__VIEWSTATE"

id="__VIEWSTATE"

 value="/wEPDwULLTEzNjQyNDE3OTUPFgQeA2tlbgUDMTIzHgFrAugHZGQIFtRxnn3yJ/pthGHALY68nryU/Q==" />

很明显 type="hidden",因此我认为 ViewState 也是一种隐藏域(个人看法而已啦)

那么 会有人问 后面 value 那一长串的东西是什么呢,这里我先卖一个小小的关子,下面我会详细讲来~~~ 

    好了,现在回到主题,什么是ViewState? 在微软MSDN上, ViewState 是这样解释   ----"获取状态信息的字典,这些信息使您可以在同一页的多个请求间保存和还原服务器控件的视图状态"。听起来真的很拗口,那我来解释一下吧,见谅~~按照个人的理解 ViewState 是asp.net 页面所特有的,是页面级别的,即在页面上的一个隐藏域中保存客户端单独使用数据的一种方式,服务器端控件中的值都自动保存在其中。在这里你要注意,ViewState 是页面级的,不支持跨页面进行传值,其次如果你希望使用ViewState,那么页面中必须有一个服务端窗体标记<form runat="server">。那么,“获取状态信息的字典” 如何解释呢?? 可能很多朋友在使用ViewState是这样使用的ViewState["k"] = 1000,并没有意识到其实 ViewState 有字典一样的方法,即键值对,如果我这样些 你应该会明白了。                                                                       

                              ViewState.Add("k",1000)

想起了吧,如同我们所使用的字典的用法 Dictionary<TKey,TValue>。

如果用反编译器 使用IL语言查看 你会看到 如下(注意红色标识的方法)

  L_0030: callvirt instance class [System.Web]System.Web.UI.StateBag [System.Web]System.Web.UI.Control::get_ViewState()

  L_0035: ldstr "k"

  L_003a: ldc.i4 0x3e8

  L_003f: box int32

  L_0044: callvirt instance void [System.Web]System.Web.UI.StateBag::set_Item(string, object)


   好了,现在开始解释 value="/wEPDwULLTEzNjQyNDE3OTUPFgQeA2tlbgUDMTIzHgFrAugHZGQIFtRxnn3yJ/pthGHALY68nryU/Q==" /> 是什么东东了!其实 当浏览器第一次加载aspx页面的时候,浏览器并不知道该页面是否有ViewState,这时候它便要去解析,首先便要去对Page_Load,如果有ViewState,浏览器便会保存ViewState,但浏览器并不会立刻保存,而是先会对ViewState的值进行序列化,然后base64编码,再调用SaveState() 方法保存 ViewState 的值,这就是为什么 value 会这样的原因!

   

  

原文地址:https://www.cnblogs.com/xianrongbin/p/2229159.html