asp.net - 最小化 View 状态 - 在 asp.net 4.0 中被 `EnableViewState` 和 `ViewStateMode` 混淆

标签 asp.net viewstate

我正在尝试清理一个旧的 ASP.NET WebForms 站点,该站点到处都启用了 ViewState。这是一个性能问题 - 巨大的 View 状态会导致明显的提交延迟。但除了一些复杂的控件和表单数据之外,大多数表单似乎并不真正需要 ViewState。不过,即使没有输入控件的表单也会生成大的 View 状态,因为我猜 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 设置,但它似乎不起作用。

最佳答案

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

关于asp.net - 最小化 View 状态 - 在 asp.net 4.0 中被 `EnableViewState` 和 `ViewStateMode` 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5485850/

相关文章:

c# - 关于使用 Ninject 的问题

Azure 中的 ASP.NET MVC 4 和 Web API - 未找到 HTTP 资源

c# - 如何使用 C# 在 RSS 提要的 channel 元素内插入元素 <item>..</item>?

c# - 如何获取在 TreeView 控件中选择的所有父节点(直到根节点)?

asp.net - 回发前是否有 viewstate 事件?

ASP.Net ListView 回发速度慢, ListView 中有大量数据

ASP.NET 自定义控件 - 回发的替代方案?

c# - 确定每个控件在 ViewState 中存储了多少数据

c# - Entity Framework 和 ASP.NET Identity

c# - 详细的 View 状态大小