我正在尝试清理一个在任何地方都启用了ViewState的旧版ASP.NET WebForms网站。这是一个性能问题 - 巨大的观点导致明显的提交延迟。但是大多数形式似乎并不需要ViewState,除了一些复杂的控制和表格数据。即使是没有输入控件的表单,也会生成大型视图状态,因为我猜asp.net存储了关于每个服务器控件的各种元数据。但是可见性状态等都是在代码中控制的,所以我认为我可以消除很多。
将EnableViewState="false"
添加到不需要它的每个控件(在页面中并在代码中创建)是非常麻烦的,所以我试图在页面/控件级别禁用它,并且有选择地使它适用于需要它的东西。 (是的,我意识到这是有风险的,但实际上只有几个大的形式和一些模板,如果解决会产生很大的不同)。
这是我没有得到的。
如果一个控件或页面有EnableViewState="false"
它的<%.. %>
描述符,或者在父页面中创建它的标记中,一切都会中断,因为代码中添加的任何ViewState数据都不起作用。所以我似乎能够在控件级别启用它,但是为每个容器中的包装器控件设置EnableViewState
为false,然后在每个控件中设置ViewStateMode=true
(其中包含那个)水平。
我没有得到的是:
ViewStateMode = ViewStateMode.Enabled
和
EnableViewState = false
用于包含其他控件的控件。
用于控件。是否可以使用ViewStateMode
启用内部控件?基本上,哪个设置在冲突时有最终结论?
对于每个容器,我希望能够在包装器控件中禁用所有内容,但仍然确保:
1)代码工作中的ViewState设置和
2)默认情况下,所有控件都禁用ViewState 和
3)我可以选择性地启用ViewState以进行子控制。
这似乎令人困惑。如果我在母版页中有一个设置为EnableViewState="false"
的包装器控件,但是然后将子控件设置为ViewStateMode="Enabled"
,它就会中断。根据MS,ViewStateMode应该取代任何外部ViewState设置,但它似乎不起作用。
答案 0 :(得分:14)
根据MSDN article on ViewStateMode,ViewStateMode
仅在EnableViewState="true"
时有意义。要实现您想要的效果,您必须将ViewStateMode="Enabled"
保留在控件上,然后将主要子控件包含在asp:Placeholder
的{{1}}中。这样,您仍然可以在代码隐藏中操作ViewState,但是没有子控件将具有ViewState(除了您通过ViewStateMode="Disabled"
明确设置的那个)。