這篇文章我講介紹Asp.net伺服器控制項的一個令人振奮的機制----ViewState,為什麼說ViewState是一個令人振奮的機制呢?我們知道,在一個web請求的期間之外保持資訊是十分必要的。在傳統asp狀態管理編程中,我們可以用伺服器端的session對象或者用戶端的cookies對象來保持資訊,但是session狀態不可擴充,cookies又不能被所有的應用程式所依賴。因此,asp.net提供了所謂的檢視狀態,即iewstate機制,這種機制可以使頁面和它的子控制項在從伺服器到用戶端再從用戶端返回的往返過程中保持狀態資訊,它可以在一個固有的無狀態環境之上創造一個有狀態的並持續執行的頁面效果。
使用檢視狀態最簡單的方法就是通過控制項從Control類繼承來的ViewState屬性,它屬於System.Web.UI.StateBag類型,是一個鍵/值對的字典。下面給出一個簡單的執行個體來說明ViewState的使用,讓我們對ViewState有一個直觀的瞭解
using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ServerControls
{
public class ViewStateDemoLabel : WebControl
{
private string _text;
public string Text
{
get
{
return (_text == null) ? String.Empty : _text;
}
set
{
_text = value;
}
}
public string TextInViewState
{
get
{
object o = ViewState["TextInViewState"];
return (o == null)? String.Empty : (string)o;
}
set
{
ViewState["TextInViewState"] = value;
}
}
protected override void RenderContents(HtmlTextWriter writer)
{
writer.Write("Text = ");
writer.Write(Text);
writer.Write("<br>");
writer.Write("TextInViewState = ");
writer.Write(TextInViewState);
}
}
}
<html>
<head>
<script runat="server">
void button1_Click(object sender, EventArgs e)
{
demolabel1.Text = textbox1.Text;
demolabel1.TextInViewState = textbox2.Text;
}
</script>
</head>
<body>
<form runat="server">
<mspuc:SiteHeader id="SiteHeader1" runat="server" SubHeading="ViewStateDemoLabel test page" Heading="Chapter 7" />
<br>
Enter your first name:
<asp:TextBox id="textbox1" runat="server" />
<br>
Enter your last name:
<asp:TextBox id="textbox2" runat="server" />
<br>
<br>
<asp:Button text="Submit" onClick="button1_Click" id="button1" Runat="server" />
<asp:Button Text="Reload" Runat="server" id="Button2" />
<br>
<br>
Here is the output from the ViewStateDemoLabel:
<br>
<msp:ViewStateDemoLabel id="demolabel1" runat="server" Font-Names="Verdana" Font-Size="Medium" />
<br>
<mspuc:SiteFooter id="SiteFooter1" runat="server" />
</form>
</body>
</html>
這裡定義了兩個屬性,其中Text屬性沒有用到ViewState而TextInViewState屬性用了ViewState。運行這段代碼,你發現當頁面post回服務端後,當頁面重新載入的時候,Text屬性的值並沒有被儲存下來,而TextInViewState屬性的值卻被儲存了下來,它會在上一次請求的處理過程的最後將他們的狀態值儲存到ViewState中。