2010-08-05 55 views

回答

4

ViewState用於在回發期間保持控件屬性的狀態。禁用它意味着您以編程方式設置的任何屬性(在代碼隱藏中)將不會在頁面回發中持久化。但是,如果聲明所有值(在.aspx頁面中),那麼禁用它並不會產生任何影響。

一個簡單的例子:

說你有這樣的ASPX標記了ViewState中啓用:

<form id="form1" runat="server"> 
<div> 
    <asp:HyperLink ID="RegisterHyperLink" runat="server" EnableViewState="true">Register</asp:HyperLink> 
    <br /><br /> 
    <asp:Button ID="ButtonPostBack" runat="server" Text="Post Back" /> 
</div> 
</form> 

你在代碼隱藏做到這一點:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     RegisterHyperLink.ForeColor = System.Drawing.Color.Red; 
    } 
} 

即使你僅在第一次加載時將HyperLink的ForeColor設置爲紅色,HyperLink在單擊執行回發的按鈕後仍然保持紅色。這是因爲ViewState存儲HyperLinks屬性的值,並在回發後重新創建它們。

如果您嘗試完全相同的事情,但在HyperLink上禁用了ViewState,當您單擊提交按鈕時,HyperLink將恢復爲其原始顏色。這是因爲視圖狀態不是「存儲」您將其設置爲紅色的事實。

在實際應用中可以正常禁用ViewState的,如果:

A)你的頁面不執行任何回發 B)您可以設置所有屬性聲明

如果你真的想了解我的ViewState」 d推薦閱讀TRULY Understanding ViewState

+0

不錯的鏈接!我會與同事分享。 – Rabid 2010-08-05 19:32:18

+0

非常好的解釋,也OP應該標記這是一個被接受的答案。 – Justin 2010-08-05 19:47:24

+0

您忘記了選項C,即只需從If塊外部移動該代碼即可在每次回發中設置值。 – 2010-08-05 21:13:12

1

這意味着您可以在頁面請求期間(即在代碼後面而不是控件模板聲明中的屬性)設置NavigateUrl屬性,該屬性將在後續回發中保留。如果您禁用EnableViewState屬性,請指定NavigateUrl,然後在以下回發請求中,NavigateUrl屬性將不起作用。

我相信這也適用於控件的其他屬性,如Text,TargetImageUrl

默認值是true。頁面的屬性先行,並將覆蓋任何子控件上的屬性。