May
10th,
2012
有这样一个应用:页面包含一个button控件和一个label控件,每次点击button控件,label控件上的值就加1。
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="0" />
<asp:Label ID="Label1" runat="server" Text="0" />
</div>
</form>
protected void Button1_Click(object sender, EventArgs e)
{
Button1.Text = (Int32.Parse(Button1.Text) + 1).ToString();
Label1.Text = (Int32.Parse(Label1.Text) + 1).ToString();
}
有这样一个问题:万维网的基本协议是HTTP协议,它是一个无状态的协议,即每一次对服务器的请求对服务器来说都是全新的。而ASP.NET的控件是服务器控件,那么在回传到服务器端的过程中,label控件上是如何保存它的值的呢?
ASP.NET Framework采用了这么一个技术,叫做“视图状态”。在如上代码打开的浏览器中,右键单击查看源代码,可以看到像下面这样的名叫__VIEWSTATE的表单隐藏字段。
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTU2ODgwMzc3NQ9kFgICAw9kFgICAw8PFgIeBFRleHQFATNkZGTXsZnPzguQbZ5UF8MGMgaHGhlNKbIlcp35mB+EX8GKXg==" />
这个表单隐藏字段封装了button和label的值,当服务器接收到这个表单隐藏字段时,对其进行解析,从而获得button和label的值。ASP.NET正是使用这样的机制,在页面回传到服务器的过程中保存了页面控件的值。
ASP.NET的每个控件都有一个ViewStateMode的属性,用于将控件的上下文绑定到视图状态中,其默认值为Enabled。因此,对于那些不需要回传到服务器的控件,可以将ViewStateMode设置成Disabled。