从微软的页面了解 ASP.NET 视图状态:
在页面生命周期的实例化阶段,创建控件层次结构并分配声明性语法中指定的那些属性。由于在构造控件层次结构时,这些声明性属性会在每次回发时自动重新分配,因此无需将这些属性值存储在视图状态中。
这意味着如果您的aspx
文件包含以下标记:
<asp:Label ID="Label1" runat="server" Font-Name="Verdana" Text="Hello, World!"></asp:Label>
不必在ViewState中保留的两件事是:
- 字体名称:
Verdana
- 文字:
Hello, World!
这两个属性不必保留在ViewState中,因为它们每次都被设置。
另一个不必保留在ViewStateaspx
中的示例是标记文件中声明的项目:
<asp:DropDownList ID="DropDownList1" runat="server">
<asp:ListItem>One</asp:ListItem>
<asp:ListItem>Two</asp:ListItem>
<asp:ListItem>Three</asp:ListItem>
</asp:DropDownList>
项目DropDownList
:
One
Two
Three
不必保留在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 仍然认为它们需要保留在ViewState中。
显然我需要我的代码及时运行。从 ASP.NET 认为它仍在读取标记的时候。
我怎么能不坚持不需要在ViewState中坚持的ViewState东西?
后记
为什么要这样做?只需将其放在标记中
不能; 不是当下拉项来自数据库时
将控件的
ViewState
属性设置为false
不能; 不是在关闭需要在ViewState中持久保存的东西时