Asp.Net 中引入ViewState的背景:
由于Http请求是一种无状态请求,即Web服务器不会记录任何客户端的独特信息,以最大效率的运行。然而此时(假设是用纯Asp 语言),假若我们提交了文本框至服务器,在提交过程中,从服务器端重新返回实例化一个页面类的对象,而这个对象页并没有保留住我们之前输入文本框的值,即我们的值丢失了!
正是在上述背景下,作为Asp 与 .NET框架的完美结合体——Asp.Net 产生了。为了克服这种障碍,其引入的状态管理功能,即应用ViewState可以在同一页面的多次服务器请求之间保留页以及控件的值,成功克服了这种困难!
在默认情况,Asp.Net页框架使用ViewState在多次回送之间保留页和控件值,而在发送至客户端浏览器的HTML代码上,则具体表现为一个或多个隐藏的<input type="Hidden">字段。
下面即就ViewState 所针对的两种保存值对象——页值和控件值,分而讨论之:
ViewState 保留页值的方法:
先看初始状态下,所建立服务器端HTML代码:
<form id="form1" runat="server">
<div>
<asp:Label ID="lbelDemo" runat="server" Text="lbelInit"></asp:Label>
<br />
<asp:Button ID="btnSub1" runat="server" Text="btnSub1"
onclick="btnSub1_Click" />
<asp:Button ID="btnSub2" runat="server" Text="btnSub2" />
</div>
</form>
<div>
<asp:Label ID="lbelDemo" runat="server" Text="lbelInit"></asp:Label>
<br />
<asp:Button ID="btnSub1" runat="server" Text="btnSub1"
onclick="btnSub1_Click" />
<asp:Button ID="btnSub2" runat="server" Text="btnSub2" />
</div>
</form>
其对应的后台代码为:
1 public partial class _Default : System.Web.UI.Page
2 {
3 protected void Page_Load(object sender, EventArgs e)
4 {
5 if (!IsPostBack)
6 {
7 //赋予ViewState为整数int型,初值为1
8 ViewState["count"] = 1;
9 }
10 if (IsPostBack)
11 {
12 //在回送状态下,实现ViewState的逐个累加
13 ViewState["count"] = (int)ViewState["count"] + 1;
14 }
15
16 }
17 protected void btnSub1_Click(object sender, EventArgs e)
18 {
19 //旨在通过点击btnSub1触发事件,实现将ViewState状态值,及时反馈在lbelDemo中
20 lbelDemo.Text = ViewState["count"].ToString();
21 }
22 }
2 {
3 protected void Page_Load(object sender, EventArgs e)
4 {
5 if (!IsPostBack)
6 {
7 //赋予ViewState为整数int型,初值为1
8 ViewState["count"] = 1;
9 }
10 if (IsPostBack)
11 {
12 //在回送状态下,实现ViewState的逐个累加
13 ViewState["count"] = (int)ViewState["count"] + 1;
14 }
15
16 }
17 protected void btnSub1_Click(object sender, EventArgs e)
18 {
19 //旨在通过点击btnSub1触发事件,实现将ViewState状态值,及时反馈在lbelDemo中
20 lbelDemo.Text = ViewState["count"].ToString();
21 }
22 }
在浏览器上,初次展现为(如下图):
查看其源代码为:
<body>
<form name="form1" method="post" action="Default.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTExNjMzNDIxNjQPFgIeBWNvdW50AgFkZD/xqNtuWCI2N3knwGlV+hqR7lUO" />
</div>
<div>
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAwKRvOPFDgKU2NnBCwKvwffWBd/L4HJDqcil+WEelebQudVq4Brk" />
</div>
<div>
<span id="lbelDemo">lbelInit</span>
<br />
<input type="submit" name="btnSub1" value="btnSub1" id="btnSub1" />
<input type="submit" name="btnSub2" value="btnSub2" id="btnSub2" />
</div>
</form>
</body>
<form name="form1" method="post" action="Default.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTExNjMzNDIxNjQPFgIeBWNvdW50AgFkZD/xqNtuWCI2N3knwGlV+hqR7lUO" />
</div>
<div>
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAwKRvOPFDgKU2NnBCwKvwffWBd/L4HJDqcil+WEelebQudVq4Brk" />
</div>
<div>
<span id="lbelDemo">lbelInit</span>
<br />
<input type="submit" name="btnSub1" value="btnSub1" id="btnSub1" />
<input type="submit" name="btnSub2" value="btnSub2" id="btnSub2" />
</div>
</form>
</body>