以上為官方對(duì) EnableViewState 的解釋,有些難懂,我們以示例的方式解釋,我們創(chuàng)建一個(gè) Web Form,并添加一個(gè) ListBox、一個(gè) Button、一個(gè)方法。
程序代碼
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void AddItem(object sender, EventArgs e)
{
list.Items.Add(DateTime.Now.Ticks.ToString());
}
</script>
<head runat="server">
<title>EnableViewState 屬性</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ListBox ID="list" runat="server">
<asp:ListItem Text="EnableViewState 屬性" Value="1"></asp:ListItem>
</asp:ListBox>
<asp:Button ID="btn" runat="server" Text="追加一個(gè) Item" OnClick="AddItem" />
</div>
</form>
</body>
</html>
在瀏覽器中訪問該網(wǎng)頁,得到 HTML 源文件中如下內(nèi)容:
這個(gè) hidden 框存儲(chǔ)的是各個(gè)控件的屬性值與狀態(tài),比如 ListBox 的 Text、Value、Selected 等,這也是為什么在 ASP.NET 里,可以在服務(wù)器端獲得列表的 Text 值的原因。
開始實(shí)驗(yàn)
現(xiàn)在點(diǎn)擊按鈕,服務(wù)器端將執(zhí)行 AddItem 方法,ListBox 中的內(nèi)容也隨之增多,查看 HTML 源文件中的“__VIEWSTATE”也隨之增多 。關(guān)于 DateTime 請(qǐng)參見 ASP.NET 時(shí)間操作。
再次實(shí)驗(yàn)
現(xiàn)在我們修改 ListBox 的 EnableViewState 屬性為 false。
再次點(diǎn)擊幾下按鈕,我們可以發(fā)現(xiàn),之前點(diǎn)擊按鈕添加的 Item 都不見了,現(xiàn)在每次點(diǎn)擊按鈕,ListBox 中都只有兩個(gè) Item,一個(gè)為靜態(tài)指定的,一個(gè)是通過 AddItem 方法添加的。這是由于 ListBox 的內(nèi)容沒有通過“__VIEWSTATE”傳送到服務(wù)器端,服務(wù)器端不知道 ListBox 之前還動(dòng)態(tài)添加的有內(nèi)容。
注意觀察,添加的數(shù)字并不相同,這說明每次點(diǎn)擊都執(zhí)行了 AddItem 方法,而不是有些文章所說的,使用 EnableViewState="false" 時(shí)方法只執(zhí)行一次,方法是每次都執(zhí)行,只是由于沒有獲得之前動(dòng)態(tài)添加(編輯、刪除)后的內(nèi)容,所以只有最新添加(編輯、刪除)的內(nèi)容。
總結(jié)
EnableViewState 指定是否向服務(wù)器端傳送某(些)控件的屬性值、狀態(tài)。
EnableViewState 的默認(rèn)值為 true,設(shè)置為 false 可以降低數(shù)據(jù)傳送量,當(dāng)然應(yīng)該在程序邏輯允許設(shè)置為 false 的情況下。
EnableViewState 可用于控件,也可用于 @ Page、@ Control、@ Master 指令語法。當(dāng)控件的 EnableViewState 的設(shè)置與指令語法的設(shè)置不一致時(shí),取 false 值。