【问题标题】:Minimizing viewstate- confused by `EnableViewState` and `ViewStateMode` in asp.net 4.0最小化视图状态 - 在 asp.net 4.0 中被 `EnableViewState` 和 `ViewStateMode` 混淆
【发布时间】:2011-03-30 11:46:23
【问题描述】:

我正在尝试清理一个旧的 ASP.NET WebForms 站点,该站点在任何地方都启用了 ViewState。这是一个性能问题 - 巨大的视图状态会导致明显的提交延迟。但是除了一些复杂的控件和表单数据之外,大多数表单似乎并不真正需要 ViewState。但是,即使没有输入控件的表单也会生成大视图状态,因为我猜 asp.net 正在存储关于每个服务器控件的各种元数据。但是可见性状态等都是在代码中控制的,所以我想我可以消除很多。

EnableViewState="false" 添加到每个不需要它的控件(在页面中并在代码中创建)是非常繁重的,所以我试图在页面/控件级别禁用它,并有选择地启用它对于需要它的东西。 (是的,我意识到这是有风险的,但实际上只有几个大表格和几个模板,如果解决了就会有很大的不同。

这是我不太明白的。

如果一个控件或页面有EnableViewState="false" 它的<%.. %> 描述符,或者在它在父页面中创建它的标记中,一切都会中断,因为在代码中添加的任何ViewState 数据都不起作用。所以我似乎能够在控制级别启用它,但是将每个容器中的包装器控件设置为 EnableViewState 为 false,然后在每个控制级别设置 ViewStateMode=true(覆盖它)。

我没有得到的是在以下情况下会发生什么:

ViewStateMode = ViewStateMode.EnabledEnableViewState = false 用于包含其他控件的控件。

用于控制。 ViewStateMode 仍然可以启用内部控件吗?基本上,当它们发生冲突时,哪个设置有最终决定权?

对于每个容器,我希望能够禁用包装控件中的所有内容,但仍要确保:

1) 代码工作中的 ViewState 设置,以及

2) 默认情况下所有控件的 ViewState 都是禁用的,并且

3) 我可以选择性地为子控件启用 ViewState。

这似乎令人困惑。如果我在母版页中有一个包装控件设置为EnableViewState="false",但随后将一个子控件设置为ViewStateMode="Enabled",它就会中断。根据 MS 的说法,ViewStateMode 应该取代任何外部 ViewState 设置,但它似乎不起作用。

【问题讨论】:

  • 如果您提供一条关键信息,这个问题就非常容易回答:ASP.NET 的版本是什么?

标签: asp.net viewstate


【解决方案1】:

根据MSDN article on ViewStateModeViewStateMode 仅在EnableViewState="true" 时才有意义。要实现您想要的,您必须将ViewStateMode="Enabled" 留在控件上,然后将主控件的子控件包装在具有ViewStateMode="Disabled"asp:Placeholder 中。这样,您仍然可以在代码隐藏中操作 ViewState,但没有子控件将具有 ViewState(您通过 ViewStateMode="Enabled" 明确设置为具有 ViewState 的控件除外)。

【讨论】:

  • 谢谢。经过一番混淆,我已经弄清楚了这一点,基本上为每个控件/页面设置了ViewStateMode="Enabled",为包装器设置了Disabled,再次为特定控件设置了Enabled。到目前为止似乎工作没有太多惊喜,并且 ViewState 垃圾的数量明显减少..
猜你喜欢
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 2016-10-03
  • 2011-12-07
  • 2011-11-06
  • 1970-01-01
相关资源
最近更新 更多