【问题标题】:Gridview ControlState very large even when viewstate disabled and not using DataKeyNamesGridview ControlState 非常大,即使视图状态被禁用且不使用 DataKeyNames
【发布时间】:2009-12-20 12:25:39
【问题描述】:

我有一个 asp:Gridview 绑定到一个 asp:ObjectDataSource。我在 GridView 上禁用了 ViewState,并且没有设置 DataKeyNames 属性。我有大约 10 个 BoundFields 和一些 TemplateFields。这些 TemplateField 不绑定到服务器控件,而是绑定到锚标记或 img 标记。

但是,在运行时,当我打开页面跟踪时,我看到 Gridview 的 ControlState 在 7 到 12K 之间变化,仅显示 14 行数据。 (呈现页面上的查看源代码也在 __VIEWSTATE 隐藏字段中提供了相同的长字符串)。我不明白为什么会发生这种情况,因为我在 gridview 上有 enableViewState="false" 并且如上所述,我没有使用 DataKeyNames。那么,这个 Gridview ControlState 是从哪里来的,有没有办法摆脱它呢?

提前致谢, 蒂姆

【问题讨论】:

  • 您确定 ViewState 来自 GridView 吗?您是否尝试过在页面级别禁用 ViewState?

标签: asp.net gridview viewstate


【解决方案1】:

我认为这很正常,因为: 控件状态不能被禁用,控件状态旨在存储控件的基本数据(例如分页控件的页码),这些数据必须在回发时可用,以使控件即使在禁用视图状态时也能正常工作

注意:默认情况下,ASP.NET 页面框架将页面中的控件状态存储在与视图状态相同的隐藏元素中。即使视图状态被禁用微软说

这意味着您实际上在 _ViewState 字段中看到了 ControlState 的数据,这没关系 因为正如微软所说,即使禁用 ViewState,控件的 ControlState 也会存储在 viewstate 中

【讨论】:

  • 感谢您的回答。但是,我觉得奇怪的是它需要 12K 来存储页码和其他少量数据。
【解决方案2】:

如果您禁用视图状态,不使用网格视图中的任何回发控件,并且不进行分页/排序,那么您最好使用中继器。中继器不必放置在标签内。因此,控制状态不会成为问题。

如果您使用的是 .net 3.5,您还可以使用 ListView 进行调查,在我看来,这就像一个中继器/gridview 混合体。

【讨论】:

  • 您好,感谢您的回答。你是说Repeater不使用controlstate?谢谢
  • Tim - 如果它使用需要它的控件,那么可以。就其本身而言,它可能不会 - 但我对此不是 100% 确定的。它不需要在服务器端表单中这一事实是一个很好的线索。
【解决方案3】:

这个article 表示控制状态实际上存储在__VIEWSTATE 中的HybridDictionary 中。

此外,这些文章说,即使您可以设置EnableViewState=false,也永远不能关闭ControlState(这就是重点——因此客户端无法破坏您的应用程序):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多