在ViewState中存储数据会减慢页面加载吗?

时间:2013-09-06 16:03:04

标签: c# asp.net

我已将我的数据集存储在视图状态中(因为我需要过滤不同客户端点击的数据并显示数据)但我觉得页面加载需要花费大量时间,甚至是checbox检查事件(带有没有任何代码可以执行的AutoPostback几乎需要2-3秒。

这只是因为视图状态数据,如果是这样,我可以实现任务的替代方案吗?我需要在客户端事件上快速显示数据,所以我一直在使用视图状态。任何工作都会有所帮助。

6 个答案:

答案 0 :(得分:1)

正如上面提到的@Tushar,ViewState不是您想要存储大量数据的地方。它实际上只是为了保持往返之间的控制状态,它确实会导致应用程序性能下降。

相反,您应该查看以下服务器管理选项:

应用程序状态 - 用于存储所有用户之间共享的数据。使用服务器内存。

会话状态 - 用于存储特定于用户会话的数据。还使用服务器内存。数据可以通过应用程序重新启动以及整个Web园或服务器场来保留。来自MSDN的更多信息:http://msdn.microsoft.com/en-us/library/z1hkazw7.aspx

这些方法的最大缺点是内存管理,因为两个选项都消耗服务器内存,并保留数据,直到重新启动某些排序,或者直到会话被删除。因此,这些方法并不总能很好地扩展。

此外,这是一篇MSDN文章,讨论各种.net状态管理方法,每种方法都有利弊:

第三种选择是通过使用.NET caching库,构建自己的和/或使用第三方缓存服务器/库来实现缓存策略。使用缓存的好处是,您可以在任何给定的指定时间后自动使数据过期。但是,在Web园或服务器场环境中工作时会引入复杂性。

最重要的是要记住,上面提到的任何策略都需要在管理/共享数据方面进行一些规划和考虑。

答案 1 :(得分:0)

如果您在ViewState中存储大量数据,您会发现性能问题。虽然ViewState实际上是用于“仅此页面”而Session是用于“此会话”,但您将达到ViewState大小的限制,其中Session最终会提高性能。

值得注意的是,您可能遇到其他类型的问题,而不仅仅是ViewState的问题(即您的数据库查询可能需要很长时间并且可能会被缓存)。

答案 2 :(得分:0)

ViewState使页面略大,因为页面的HTML中嵌入了额外的数据来保存序列化的ViewState。额外大小是否会导致加载问题取决于连接速度,以及视图状态相对于页面其余部分的大小。

ViewState随每个HTTP请求一起发送回服务器(包括你的AutoPostback)。同样,这是否会导致明显的性能问题取决于视图状态大小和连接速度。

在宽带(ish)连接上,可以在典型页面中找到ViewState数据量,您将看不到2-3秒额外的处理时间。

<强>诊断

使用浏览器中的开发人员工具(在IE中,按F12)。您可以监控Web请求,包括发送和接收的确切标题和正文。您还可以查看每个HTTP请求的时间。如果ViewState不是很大(也许不超过1-2K)并且你的连接速度不是太慢,那不是你的罪魁祸首。

<强>替代

您可以完全保留服务器端状态,或者将任何大型状态项完全放在服务器上。您可以使用Ajax请求来处理依赖于该状态的页面事件。

答案 3 :(得分:0)

不是多次从数据源加载数据,而是只进行一次。其他答案谈论访问数据。我遇到了每次进行回发时加载数据的实例。

string myString;

public string MyString
{
    get
    {
        // If there is already data in "myString", do not load it again!
        if (this.ViewState["myData"] == null)
        {
             // Load data one time
             this.ViewState["myData"] = "Hello";
        }
        return this.ViewState["myData"] as string;
    }
}

答案 4 :(得分:0)

ViewState降低页面的速度取决于您拥有多少视图状态。我继承了生成超过一兆字节视图状态的页面,并看到Web服务器花费10秒钟处理视图状态。如果您不想重写应用程序并且需要大量的视图状态,则需要研究用于保存/恢复视图状态的备用策略。将ViewState保存到数据库甚至普通文件要快得多 - 不必在每个请求上向/从客户端流式传输视图状态。

最好的策略是尽量避免使用viewstate。

我想应该补充一下,有些控件只是ViewState猪,有些网格对于viewstate消费来说非常糟糕。

答案 5 :(得分:0)

您可以查看网页来源并获取ViewState值,并使用 url 下面的在线ViewState decoder来查看您的网页中存储的值的大小页面的ViewState字段:

http://ignatu.co.uk/ViewStateDecoder.aspx

如果您发现您的视图状态拥有大的存储值,那么您应该找到存储Dataset的替代方法。

无论如何,您应该避免将数据集放入ViewState。