尤其要感谢徐少侠 等同学的回复,使得我发现了我以往的几个错误认识。重新学习过后,我们开始我们的第二讲的学习研究吧!这一次,我们关注的焦点是:
1. 什么是VIEWSTATE, 什么不是VIEWSTATE ?
2. VIEWSTATE和页面生命周期的关系 ?
VIEWSTATE首先表现为控件(Control)的属性,类型为StateBag。而StateBag实现了IDictionary(所以是一种键值对)和IStateManager。而IStateManager定义了三个方法:LoadViewState、SaveViewState和TrackViewState,一个属性:IsTrackingViewState(再次推荐.NET Reflactor反编译工具,还没有的同学赶快下一个,好东西呀)。望文生义,可以大概猜测得到,VIEWSTATE应该会被加载(Load),被保存(Save);而Track是什么意思呢?
ASP.NET页面生命周期是一个比较复杂的东西,而和理解VIEWSTATE有关的呢,应该是以下几个:Init、LoadViewState、LoadPostBackData、Load、RaisePostBackEvent和Render几个阶段。下面简要的说明一下:
1. Init:初始化控件。将页面初始化为一个“控件树”(和DOM树其实很相似),一般来说,根节点就是一个HtmlForm控件,就是由<form runat="server" ></form>转化而来的。
2. LoadViewState:这个阶段,有页面Post过来的VIEWSTATE将被解析加载(其实解析和加载还可分为两步,此处不细究)到控件。使得控件被回复到页面被提交之前的状态。
3. LoadPostBackData:这个阶段和VIEWSTATE没有关系,但能澄清我们很多人的误解!包括我第一节里所犯的最大的错误,为了更清晰的演示,我修改了之前的代码:
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="I am Label"></asp:Label><br />
<asp:TextBox ID="TextBox1" runat="server" Text="I am TextBox" ></asp:TextBox><br />
<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem Text="I am ListItem (1)"></asp:ListItem>
<asp:ListItem Text="I am ListItem (3)"></asp:ListItem>
<asp:ListItem Text="I am ListItem (2)"></asp:ListItem>
</asp:DropDownList><br />
<asp:LinkButton ID="LinkButton1" runat="server" Text="I am LinkButton">LinkButton</asp:LinkButton><br />
<asp:Button ID="Button1" runat="server" Text="I am Button"
onclick="Button1_Click" /><br />
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Default2.aspx">HyperLink</asp:HyperLink>
</div>
</form>
</body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="I am Label"></asp:Label><br />
<asp:TextBox ID="TextBox1" runat="server" Text="I am TextBox" ></asp:TextBox><br />
<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem Text="I am ListItem (1)"></asp:ListItem>
<asp:ListItem Text="I am ListItem (3)"></asp:ListItem>
<asp:ListItem Text="I am ListItem (2)"></asp:ListItem>
</asp:DropDownList><br />
<asp:LinkButton ID="LinkButton1" runat="server" Text="I am LinkButton">LinkButton</asp:LinkButton><br />
<asp:Button ID="Button1" runat="server" Text="I am Button"
onclick="Button1_Click" /><br />
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Default2.aspx">HyperLink</asp:HyperLink>
</div>
</form>
</body>