在gridview上显示数据,当数据量比较大时,跳转页面或者弹出对话框十分缓慢,分析原因如下:
服务器控件的EnableViewState=true(默认)坑爹啊
缓慢案例:(在客户端查看源代码如下)
改进之后(在客户端查看源代码)
这就是跳转缓慢的原因:所有服务器控件的EnableViewState=true。
详解:microsoft默认.net2.0的服务器控件的EnableViewState=true,也就是说每一次客户端对服务器有请求时都会向服务器回传当前页面的所有服务器控件的视图状态信息。
解决方法:只需要把没有必要的控件(例如静态控件没有事件触发的控件)的EnableViewState=false即可。
以下是关于ASP.NET服务器控件的ViewState的详细介绍
由于Web应用程序创建于HTTP协议的顶层,这是一个无状态的协议,因此,保持状态信息则变得非常困难。而对于利用ASP.NET 2.0技术创建服务器控件而言,保持状态信息也是非常重要的,其主要解决途径是利用视图状态和控件状态。视图状态是一项非常重要的技术,它能使得页面和页面中的控件在从服务器到客户端,再从客户端返回的往返过程中保持状态信息。这样就可以在Web这种无状态的环境之上创建一个有状态并持续执行的页面效果。
视图状态的具体运行过程为:每当用户请求某个.aspx页面时,.NET框架首先把相关控件的状态数据序列化成一个字符串,然后,将其做为名为__VIEWSTATE的隐藏域的Value值发送到客户端。(查看源文件即可看到)如果页面是第一次被请求,那么服务器控件也将是被第一次执行时,名为__VIEWSTATE的隐藏域中只包含控件的默认信息,通常为空或者null。在随后的回送事件中,ViewState中就保存了服务器控件在前面回送中可用的属性状态。这样服务器控件就可以监视在当前被处理的回送事件发生之前的状态了。这些过程是由.NET框架负责的,对用户来说是执行.aspx页面就有了持续执行的效果。
默认情况下,控件的ViewState将被启用,即:EnableViewState=true(最坑爹),如果不需要使用ViewState,最好还是将它关闭。以下情况将不再需要ViewState:(1)控件未定义服务器端事件(这时的控件事件均为客户端事件且不参加回送的);(2)控件没有动态的或数据绑定的属性值。关闭视图状态的方法是将控件的EnableViewState的值设置为"false",即EnableViewState="false"。
默认情况下,视图状态的有关内容在编译运行发送给客户端时,读者将在页面的HTML代码中看到__VIEWSTATE隐藏域内容(如上图所示)。这是一些没有意义的字符串,是.NET框架通过Base64位编码对相关内容编码的结果。它们是通过明文方式在客户端和服务器端之间往返传送。在某些情况下,例如涉及密码、账号、连接字符串等敏感内容时,使用默认方式是很不安全的。(了解)
使用视图状态具有以下3个优点:一、耗费的服务器资源较少(与Application、Session相比)。因为,视图状态数据都写入了客户端计算机中。二、易于维护。默认情况下,.NET系统自动启用对控件状态数据的维护。三、增强的安全功能。视图状态中的值经过哈希计算和压缩,并且针对Unicode实现进行编码,其安全性要高于使用隐藏域。(重点掌握,其余了解)
使用视图状态具有以下3个缺点:一、性能注意事项。由于视图状态存储在页本身,因此如果存储较大的值,即使在视图状态分块的情况下,用户显示页和发送页时的速度仍然可能减慢(此即为上述问题原因)。二、设备限制。移动设备可能没有足够的内存容量来存储大量的视图状态数据。因此,移动设备上的服务器控件时,将使用其他的实现方法。三、潜在的安全风险。视图状态存储在页上的一个或多个隐藏域中。虽然视图状态以哈希格式存储数据,但它可以被篡改。如果直接查看页输出源,可以看到隐藏域中的信息,这导致潜在的安全性问题。(重点掌握,其余了解)
viewstate是用于:
1. 保存“某些”控件的状态的;
2. 所谓的“状态”是在页面后台(cs文件)中被修改的。(用于理解)
只有一些在后台代码确实触发事件的服务器控件EnableViewState=true,静态控件(例如图片,说明文字,用于显示数据的gridview等可为false).