【发布时间】:2012-06-26 13:47:43
【问题描述】:
来自微软页面Understanding ASP.NET View State:
在页面生命周期的实例化阶段,创建控件层次结构并分配声明性语法中指定的那些属性。由于在构造控件层次结构时,这些声明性属性会在每次回发时自动重新分配,因此无需将这些属性值存储在视图状态中。
这意味着如果您的aspx 文件包含以下标记:
<asp:Label ID="Label1" runat="server" Font-Name="Verdana" Text="Hello, World!"></asp:Label>
必须保留在 ViewState 中的两件事是:
-
字体名称:
Verdana -
文字:
Hello, World!
这两个属性不必保留在 ViewState 中,因为它们每次都设置。
另一个不必保留在 ViewState 中的示例是在 aspx 标记文件中声明的项目:
<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem>One</asp:ListItem>
<asp:ListItem>Two</asp:ListItem>
<asp:ListItem>Three</asp:ListItem>
</asp:DropDownList>
DropDownList 项:
OneTwoThree
不必保留在 ViewState 中,因为它们每次都被声明。
这就是我想做的。我希望不必在 ViewState 中保留的东西不要在 ViewState 中保留。相反,做的事情必须在 ViewState 中持久化,我希望它们在 ViewState 中持久化。
再次来自 MSDN:
在实例化阶段构建控件层次结构时,Label 的 Text 属性将设置为“Hello, World!”并且它的 Font 属性将其 Name 属性设置为 Verdana。由于这些属性将在实例化阶段的每次页面访问中设置,因此无需将这些信息保存在视图状态中。
一个例子
除了在标记中声明属性之外,想象它们是以编程方式声明的:
Label1.Font.Name = "Verdana";
Label1.Text = "Hello, World!";
或
DropDownList1.Items.Add("One");
DropDownList1.Items.Add("Two");
DropDownList1.Items.Add("Three");
现在为了向 ASP.net 的魔力发出信号,即属性总是在那里,并且不需要在 ViewState,我将在页面初始化期间进行此更改:
protected void Page_Init(object sender, EventArgs e)
{
//Set properties *before* PageLoad; before the viewstate is read
//That way the properties will not have to be added to the viewstate
Label1.Font.Name = "Verdana";
Label1.Text = "Hello, World!";
DropDownList1.Items.Add("One");
DropDownList1.Items.Add("Two");
DropDownList1.Items.Add("Three");
}
除非那不起作用。即使我在页面周期中足够早地设置控件的属性,并且即使我设置属性每次,ASP.NET 仍然认为它们需要保留在 视图状态。
显然我需要我的代码及时运行。从 ASP.NET 认为它仍在读取标记的时候开始。
我如何不在 ViewState 中保留不需要在 ViewState 中保留的东西?
后记
-
为什么要这样做?只需将其放在标记中
不能;不是当下拉项来自数据库时
-
将控件的
ViewState属性设置为false不能;不会关闭 需要保留在 ViewState
中的事情
【问题讨论】:
标签: asp.net viewstate page-init