2010-08-05 48 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。页面的属性先行,并将覆盖任何子控件上的属性。