我正在尝试清理一个早期的ASP.NET WebForms站点,其中启用了ViewState。这是一个性能问题 – 巨大的视野导致明显的提交延迟。但是大多数的表单似乎并不需要ViewState,除了一些复杂的控件&表单数据。即使没有输入控件的窗体也会产生大的viewstates,因为我猜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设置,但它似乎不起作用。
解决方法
根据
MSDN article on ViewStateMode,ViewStateMode仅在EnableViewState =“true”时有意义。要实现你想要的,你必须在控件上离开ViewStateMode =“Enabled”,然后将主要的子控件包装在具有ViewStateMode =“Disabled”的asp:占位符中。这样,您仍然可以在代码隐藏中操作ViewState,但是没有子控件将具有ViewState(除了您通过ViewStateMode =“Enabled”显式设置)。