【问题标题】:ASP.Net ListView Postback slow with lots of data in listviewASP.Net ListView 回发速度慢,列表视图中有大量数据
【发布时间】:2011-07-20 02:25:39
【问题描述】:

我的页面上有一个可以显示 10,000 或更多行的列表视图。

页面顶部有一个简单的“客户”下拉菜单,它会自动回发以更改数据过滤器。我一直在尝试优化这个例程,我注意到大部分时间都花在将 ViewState 从客户端传输到服务器上。

我已将 EnableViewState="false" 添加到 ListView 控件,但它并没有改变它。我查看了 Fiddler 中的请求,如果屏幕上的客户说 50 行,则请求内容长度很短 - 如果他们有 10,000 行或其他内容,则它很大。

有人解决了吗?

【问题讨论】:

  • 您的查询可能是瓶颈。
  • 查询不是瓶颈... postdata包含viewstate,这是fiddler验证的瓶颈。
  • 我的错。我在你的问题中错过了这一点:“但它并没有改变它。”如果您的问题已通过 VinayC 的建议得到解决,您需要通过将他的答案标记/检查为已接受来表扬他。
  • 看来控制级别属性并没有解决问题。如果我禁用整个页面的 ViewState,那么它确实会禁用整个页面,但这并不是真正的目标。 ListView 似乎没有响应 EnableViewState 属性。

标签: asp.net listview request postback viewstate


【解决方案1】:

这是因为数据绑定控件(包括列表视图)会将其数据源存储到视图状态中。所以视图状态会很大导致页面大小膨胀。

其中一个解决方案是禁用列表视图的视图状态并在每次页面回发时绑定它。

更好的解决方案是进行数据存储侧分页,即如果您仅显示 50 行,则仅从数据库中获取 50 行。这通常称为 ASP.NET 中的自定义分页,您可以找到几个用于数据访问技术的自定义分页的示例。例如,

使用实体框架和 ObjectDataSource 自定义分页:http://geekswithblogs.net/Frez/articles/using-the-entity-framework-and-the-objectdatasource-custom-paging.aspx

您可以使用 SQL Server 排名函数在存储过程中进行分页:http://msdn.microsoft.com/en-us/library/bb445504.aspx

【讨论】:

  • 如何禁用列表视图的视图状态?我不想分页,因为用户使用 ctrl+f 可以快速找到特定记录。如果您从一个小列表开始,15,000 条记录需要大约 3 秒才能完全加载,如果您从一个大列表开始,则需要 30 秒。
  • @user771841,它的控制级别属性(最好在设计模式下设置)。在 .NET 4 中,在 ListView 标记中使用 ViewStateMode="Disabled"。对于以前的版本,您需要使用 `EnableViewState="false"。在以前的版本中,您可能不得不摆弄页面级别的视图状态。
  • 对我来说,在 ListView 上禁用 ViewStateMode 只会将 ViewState 降低 20%(与将 EnableViewState 设置为 false 相同),在不渲染 ListView 的情况下,ViewState 会降低近 100%。你知道这是为什么吗?我已尝试禁用 ValidateRequest 和 EventValidation,因为我已阅读 ViewState 用于支持这些功能无效。
  • @Michael,并不是每个状态都进入视图状态包,一些必要的状态被存储在控制状态包中并且不能被禁用。视图状态和控制状态都存储在同一个隐藏变量中。我的猜测是 DataKeyNamesDataKeys 可能会存储在控制状态中,因此请从这个角度进行调查。
猜你喜欢
  • 2019-08-28
  • 2017-06-03
  • 2013-03-22
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多