万维网(world wide web)的基本协议是 HTTP 协议,是一种无状态的协议,每一次页面发出的请求对于服务器来说都是新的。
ASP.NET Framework 成功突破的 HTTP 协议的限制,例如给Label 空间的 Text 属性赋一个值,Label 会在页面多次请求之间保存这个值,那这个值是如何保存的呢?
下面请看代码:
-----------------------------------------------------------------------------------------------------
<%@ Page Language="C#" Trace="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = (Int32.Parse(Label1.Text) + 1).ToString();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="0"></asp:Label><br />
<asp:DropDownList
ID="DropDownList1" runat="server">
<asp:ListItem Text="选择框" Value="0"></asp:ListItem>
<asp:ListItem Text="选择1" Value="1" />
</asp:DropDownList>
</div>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
</form>
</body>
</html>
---------------------------------------------------------------------------------------
我们运行了以上代码就会发现在生产的HTML代码中存在 <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNjY2NzE5NTQ5D2QWAgIED2QWAgIBDw8WAh4EVGV4dAUBNWRkZBLujmFDkSLFCddbESB5E6G9ib0WjFb9EjqblCn46L0N" />
ASP.NET FrameWork 使用了__VIEWSTATE 来保存页面的状态,这个隐藏的表单包含了页面所有空间的属性与值,当页面回传服务器的过程中,Asp.net Framework 就对这个字符窜就行分解,重建保存在视图状态中的所有属性的值。
默认情况下ASP.NET 是启用视图状体的,如需要查看具体情况可以在 @Page 中 启用 Trace = "true" 页面跟踪。