最小化视图状态 - 在asp.net 4.0中由“EnableViewState”和“ViewStateMode”混淆

时间:2011-03-30 11:46:24

标签: asp.net viewstate

我正在尝试清理一个在任何地方都启用了ViewState的旧版ASP.NET WebForms网站。这是一个性能问题 - 巨大的观点导致明显的提交延迟。但是大多数形式似乎并不需要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设置,但它似乎不起作用。

1 个答案:

答案 0 :(得分:14)

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