什么时候应该在服务器控件上启用EnableViewState?

时间:2009-01-15 22:23:41

标签: asp.net

是否应该在服务器控件上启用查看状态时有任何准则或规则?当它应该

我正在查看此SqlDatasource example并注意到标签控件的视图状态未启用:

<asp:Label ID="ErrorMessageLabel" EnableViewState="false" runat="server" />

为什么标签控件上没有启用EnableViewState?我知道启用视图状态会带来一些开销,所以我只想在需要时才使用它。

7 个答案:

答案 0 :(得分:20)

这是一个很好的经验法则:如果您(1)在代码隐藏中更改属性的值,并且(2)需要知道您在稍后的回发中设置的值而不重新计算该值,那么您需要使用视图状态。

例如。在我的页面标记中,我可能有一个像这样指定的Label控件:

<asp:Label ID="TitleLabel" runat="server" Text="Update this Employee" />

然后在Page_Load事件中我有这段代码:

If Not IsPostBack AndAlso myEmployeeObject.IsNew Then TitleLabel.Text = "Create a new Employee"

通过更改Text属性的值,我在ViewState中引入了一个新元素。如果我在任何后续PostBack期间获得Label的Text属性的值,则该值将为“Create a new Employee”。

这是我在开始最小化页面使用的ViewState数量时所做的事情。我在页面上enable tracing。在浏览器中呈现时,跟踪输出将添加到页面底部。跟踪输出标识页面上的每个服务器控件,并包括每个控件存储多少ViewState(以字节为单位)。我使用这些信息来计算何时交换ViewState的开销来计算重新计算值的开销。

在我之前的示例中,我会选择在每个PostBack上重新计算Label的Text属性,并停止在ViewState中存储Text属性。这是我更新的标记的样子:

<asp:Label ID="TitleLabel" runat="server" Text="Update this Employee" EnableViewState="false" />

我更新的Page_Load事件:

If myEmployeeObject.IsNew Then TitleLabel.Text = "Create a new Employee"

答案 1 :(得分:1)

只有当你需要在回发或其他东西上获取该吸盘的价值时,才应该使用viewstate。因此,对于标签示例,如果您的代码类似于

,则只需要启用viewstate
void Button1_Click()
{
   label1.text += " more!";
}

没有viewstate回发无法找出标签的内容,你只是得到“更多!”一遍又一遍,没有追加。试试吧。

真的,我们办公室的经验法则是在页面级别将其关闭,然后根据需要启用它。

答案 2 :(得分:1)

首先了解视图状态,这是一个可能有帮助的blog条目。 通过在页面级别禁用视图状态来开始开发页面。 asp .net 2.0中的大多数控件都保存了在控件状态下运行所需的状态,因此禁用视图状态不会影响大多数控件。

对于在视图状态(如列表框)中保存绑定到它们的数据的控件,可以通过对PreInit事件进行绑定来避免数据在视图状态下登陆(对大多数用例来说都可以正常工作)。 / p>

除此之外,如果你没有需要它的第三方控件,你使用视图状态所产生的性能损失远大于你在回发之间得到的状态保证。

最后使用工具帮助您查看页面视图状态中的字节。 ASP.NET视图状态帮助程序和Fiddler中的一个显示视图状态数据的内容将在这方面为您提供很多帮助。

答案 3 :(得分:0)

仅当您希望保留跨http请求的值时才启用viewstate,除此之外,保持it = false。你也没有必要使用enableviewstate来使用控件。

答案 4 :(得分:0)

每当您拥有一个重要内容的控件(如文本框或下拉列表)时,您希望启用viewstate以便内容可用并在回发时更新到日期。

任何类型的控件输出一些静态文本(你没有从用户那里得到的东西)通常不会有viewstate启用。这最小化了视图状态。

答案 5 :(得分:0)

您需要确保更好地理解ViewState。没有像“只有你必须启用ViewState”这样的一揽子声明才会真正有意义,除非你这样做。了解视图状态何时加载/保存/弄脏。

here's我见过的更好的文章之一

答案 6 :(得分:0)

说实话,我想不出任何时候你想要将标签控件的viewstate设置为true。这是制作w3wp.exe take up hoards of memory的快捷方式。