3

从微软的页面了解 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中持久保存的东西时

4

1 回答 1

2

你基本上已经回答了你自己的问题。

对于库存 asp.net 控件,您不能基于每个属性决定哪些内容留在 ViewState 中,哪些内容不留在 ViewState 中。

如果您滚动自己的自定义控件,则可以通过自定义属性列表等更精细地控制存储哪些属性,哪些不存储,但是您必须重新创建轮子。

您可能能够从内置控件继承(我怀疑任何被密封)并覆盖视图状态和/或控件状态处理程序。老实说,这听起来像是一项艰巨的任务。

我明白你为什么要问 - 为什么不比当前模型更有效。问题是 ASP.NET 从来都不是关于效率的,当然也不是轻量级的。它更多的是以牺牲性能和简单性为代价的快速快速开发 - 只需以 ajaxUpdatePanel设计模式为例。为了便于开发,这是一个完全臃肿的 ajax 实现。

于 2012-06-26T13:55:42.167 回答