我正在尝试清理一个到处都启用了ViewState的旧ASP.NET WebForms站点。这是一个性能问题--巨大的视图状态会导致明显的提交延迟。但是,除了一些复杂的控件和表单数据之外,大多数表单似乎并不真正需要ViewState。然而,即使没有输入控件的表单也会生成大的视图状态,因为我猜asp.net存储了关于每个服务器控件的各种元数据。但是可见性状态等等,都是在代码中控制的,所以我想我可以消除很多东西。
将EnableViewState="false"
添加到每个不需要它的控件(在页面中并在代码中创建)是相当繁琐的,所以我尝试在页面/控件级别禁用它,并有选择地为需要它的东西启用它。(是的,我知道这有风险,但实际上只有几个大的表单和几个模板,如果解决了,就会有很大的不同)。
这是我不太明白的地方。
如果一个控件或页面有EnableViewState="false"
它的<%.. %>
描述符,或者在父页面中创建它的标记中,一切都会中断,因为在代码中添加的任何ViewState数据都不起作用。因此,我似乎可以在控件级别上启用它,但是对于每个容器中的包装器控件,将EnableViewState
设置为false,然后在每个控件级别上设置ViewStateMode=true
。
我不明白的是在下列情况下会发生什么:
包含其他控件的控件的ViewStateMode = ViewStateMode.Enabled
和EnableViewState = false
。
作为控件。内部控件还能在ViewStateMode
中启用吗?基本上,当它们冲突时,哪种设置具有最终决定权?
对于每个容器,我希望能够禁用包装器控件中的所有内容,但仍然确保:
1) code 中的ViewState设置,以及
2)所有控件默认禁用ViewState ,以及
3) I可以有选择地为子控件启用ViewState。
这似乎令人困惑。如果我在母版页中有一个包装控件设置为EnableViewState="false"
,但随后又将一个子控件设置为ViewStateMode="Enabled"
,则它会中断。根据微软的说法,ViewStateMode应该取代任何外部ViewState设置,但它似乎不起作用。
发布于 2011-04-06 01:14:41
根据MSDN article on ViewStateMode,ViewStateMode
只有在EnableViewState="true"
时才有意义。要实现您想要的功能,您必须将ViewStateMode="Enabled"
保留在控件上,然后将主控件的子控件包装在具有ViewStateMode="Disabled"
的asp:Placeholder
中。这样,你仍然可以在代码背后操作ViewState,但没有子控件会有ViewState (除了那些你显式设置为通过ViewStateMode="Enabled"
拥有它的控件)。
https://stackoverflow.com/questions/5485850
复制相似问题