我在同一页面上有一个Entry Form和一个GridView。从GridView中选择一行,在其上方的Entry Form中填充TextBox,并使用GridView行的所有条目。
当打开此页面并从GridView中选择任何行时,我可以看到每个AJAX请求都会向服务器发送大量View State数据。我选择浏览器的“查看源”选项来检查这一点。我尝试使用以下命令禁用页面顶部的视图状态:EnableViewState =“false”,但我的应用程序停止正常执行。
在从GridView中选择任何行时,会生成错误,因此我重新启用了View State。
是否有任何优化的方法来使用View State并保持较小的AJAX请求?还有与View State压缩有关的任何内容吗?
我正在使用ASP.NET 2.0。
答案 0 :(得分:4)
从您使用UpdatePanel
的那一刻开始,ajax调用就是您坚持发送所有表单发布数据,包括大视图状态。
您有两种方法,一种是自定义, ajax调用仅关注您控制的更改,而不是UpdatePanel所做的完整回发。
另一种方法是最小化每个帖子发回的页面,并压缩视图状态。
要压缩视图状态,我建议这里有一些可以使用源代码的页面。
http://www.codeproject.com/Articles/14733/ViewState-Compression
http://www.hanselman.com/blog/ZippingCompressingViewStateInASPNET.aspx
和我做的类似问题: How to limit the number of post values on UpdatePanel?
答案 1 :(得分:3)
首先,如果您使用的是UpdatePanel,请不要这样做。效率不高。实际上它是完整的回发,你显然试图避免。
为什么不使用GET AJAX请求?这不会向服务器发布任何内容,除了您传递的URL,其中可能包含您需要的行的ID?
基本上:
创建一个将返回所需数据的WebService。
将onclick事件绑定到网格上每行的“选择”按钮。 (在绑定事件服务器端可能最容易完成,使用绑定对象获取行的Id)
如果调用上面创建的Web服务(http://api.jquery.com/jQuery.get/)
在javascript事件的onSuccess方法中,根据需要构建条目。
答案 2 :(得分:1)
我同意Kevin M和Aristos。另外还有另一种方法如何最小化传输的ViewState大小:使用自定义视图状态提供程序将其存储在服务器端。本文介绍如何创建此类提供程序:http://www.codeproject.com/Articles/8001/ViewState-Provider-an-implementation-using-Provide。
答案 3 :(得分:1)
正如所有帖子中所述,您可以通过多种方式进行某种形式的压缩,您可以自己实施或购买视图状压缩器,但这对您没有多大帮助。可能有趣的是你应该期望的压缩量。请查看:RadCompression获取有关压缩率和性能改进的信息,这些信息通常与所有选项(免费/付费)相同。
我认为费率不尽如人意,您应该为您的问题寻找替代方案。
现在,如果我理解正确,您想在同一页面上编辑表单中的网格行。在评论中,您使用的是更新面板,根据所描述的行为,您在更新面板中同时拥有网格和编辑表单。 如果您的页面只有网格和编辑表单,那么在更新面板中显示它们将无济于事。
我为测试目的做了一个小例子,我有一个10行网格,有5列,并且在同一页面上有5个字段的编辑表单。 我的观察是:
这是因为使用更新面板基本上意味着您不刷新整个页面,而只刷新updatepanel + viewstate中的区域。所以,如果你的所有页面都被更新面板包围,那对你来说根本不会有帮助,把它称为AJAX是不公平的:)。
现在,asp.net网络表单有它的优点但我的意见是没有人喜欢asp.net网页表单了,特别是当手头有asp.net mvc / wcf / jquery时。您的问题证明了asp.net Web表单在最初使用时的一个限制。
我对您的问题的一般解决方案是:
答案 4 :(得分:0)
简短的回答是否定的。
这是一种在ajax调用
上从viewstate的离合器中释放页面的方法