限制关于AJAX调用的视图状态信息

时间:2012-01-16 08:20:17

标签: asp.net asp.net-2.0

我在同一页面上有一个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。

5 个答案:

答案 0 :(得分:4)

从您使用UpdatePanel的那一刻开始,ajax调用就是您坚持发送所有表单发布数据,包括大视图状态。

您有两种方法,一种是自定义, ajax调用仅关注您控制的更改,而不是UpdatePanel所做的完整回发。

另一种方法是最小化每个帖子发回的页面,并压缩视图状态

要压缩视图状态,我建议这里有一些可以使用源代码的页面。

http://www.codeproject.com/Articles/14733/ViewState-Compression

http://www.hanselman.com/blog/ZippingCompressingViewStateInASPNET.aspx

http://www.bloggingdeveloper.com/post/How-To-Compress-ViewState-in-ASPNET-20-ViewState-Compression-with-SystemIOCompression.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

What pitfalls arise by using a custom view-state provider?

答案 3 :(得分:1)

正如所有帖子中所述,您可以通过多种方式进行某种形式的压缩,您可以自己实施或购买视图状压缩器,但这对您没有多大帮助。可能有趣的是你应该期望的压缩量。请查看:RadCompression获取有关压缩率和性能改进的信息,这些信息通常与所有选项(免费/付费)相同。

我认为费率不尽如人意,您应该为您的问题寻找替代方案。

现在,如果我理解正确,您想在同一页面上编辑表单中的网格行。在评论中,您使用的是更新面板,根据所描述的行为,您在更新面板中同时拥有网格和编辑表单。 如果您的页面只有网格和编辑表单,那么在更新面板中显示它们将无济于事。

我为测试目的做了一个小例子,我有一个10行网格,有5列,并且在同一页面上有5个字段的编辑表单。 我的观察是:

  1. 有一个没有样式的网格给我一个1500 char的viewstate,相当于2KB。添加样式将使您在viewstate中获得更多数据,您可以检查任何付费网格控件示例,并查看未压缩视图状态的数量会持续数百行。
  2. 在网格选择项目上回发孔页面(无更新面板)发出了3KB的请求并获得了6KB的响应
  3. 使用围绕网格和编辑表单的更新面板进行回发,发出了3KB的请求,并获得了6KB的aprox响应。内容大小几乎没有变化。
  4. 这是因为使用更新面板基本上意味着您不刷新整个页面,而只刷新updatepanel + viewstate中的区域。所以,如果你的所有页面都被更新面板包围,那对你来说根本不会有帮助,把它称为AJAX是不公平的:)。

    现在,asp.net网络表单有它的优点但我的意见是没有人喜欢asp.net网页表单了,特别是当手头有asp.net mvc / wcf / jquery时。您的问题证明了asp.net Web表单在最初使用时的一个限制。

    我对您的问题的一般解决方案是:

    1. 仅使用html控件进行数据显示(您的网格应该是一个jquery / extjs插件,显示从启用WCF ajax的Web服务获得的json数据)。摆脱asp网格将帮助您将视图状态降低到几乎为零,并使页面源可读。
    2. 制作WCF Ajax Web服务并在客户端< - >中交换json wcf关系(使用方法的示例有:getgriddata,addnewrow,deleterow,editrow)。拥有这些方法意味着您根本不需要完全回发,这将使您的页面更好,更灵敏。另外,我会尝试不在页面事件中使用任何代码。
    3. 使用您喜欢的jquery或其他javascript框架调用您的Web服务;确保你不使用可怕的asp:ScriptManager将帮助你摆脱对/ScriptResource.axd的多次调用?和一些奇怪的源javascript做了一些布线。

答案 4 :(得分:0)

简短的回答是否定的。

这是一种在ajax调用

上从viewstate的离合器中释放页面的方法
  • 不依赖于网格视图的行单击事件。
  • 将链接列添加到网格视图。不要使用服务器点击事件。
  • link当用户点击链接时,通过发送行的id进行ajax调用。您将使用jQuery进行ajax get调用。
  • 一旦ajax调用返回,取出记录的数据并找到表单元素,再次使用jQuery并填充它们