我目前在asp.net mvc网站上使用jqgrid,我们的网络(内部应用程序)运行缓慢,似乎需要花费很长时间才能加载网格(问题既涉及网络,也涉及解析,渲染)
我试图确定如何最小化我发送给客户端的内容,以使其尽可能快。
这是控制器将数据加载到网格中的操作的简化视图:
[AcceptVerbs(HttpVerbs.Get)] public ActionResult GridData1(GridData args) { var paginatedData = applications.GridPaginate(args.page ? ? 1, args.rows ? ? 10, i => new { i.Id, Name = "<div class='showDescription' id= '" + i.id + "'>" + i.Name + "</div>", MyValue = GetImageUrl(_map, i.value, "star"), ExternalId = string.Format("<a href=\"{0}\" target=\"_blank\">{1}</a>", Url.Action("Link", "Order", new { id = i.id }), i.Id), i.Target, i.Owner, EndDate = i.EndDate, Updated = "<div class='showView' aitId= '" + i.AitId + "'>" + GetImage(i.EndDateColumn, "star") + "</div>", }) return Json(paginatedData); }
所以我正在建立一个json数据(我有大约200条以上的记录),然后将其发送回GUI以放入jqgrid。
我能想到的一件事是 重复数据。 在某些json字段中,我将HTML附加在原始“数据”顶部。每个记录上的HTML都是相同的。如果我可以只发送数据并在客户端“附加” HTML周围,这似乎会更有效率。这可能吗?然后,我只是通过电线发送实际数据,并让客户端在其余的HTML标签(div等)上添加在一起。
另外,如果还有关于如何最大程度地减少邮件大小的其他建议,那就太好了。我猜这些解决方案会在某个时候增加客户端负载,但减少网络流量可能是值得的。
我同意Craig Stuntz的观点:动态内容HTTP压缩的使用可能非常有效。但是,也非常有用的是减少发送的数据。
首先,您应该没有时间将HTML数据发送回jqGrid。jqGrid具有 自定义格式程序 (请参见http://www.trirand.com/jqgridwiki/doku.php?id=wiki:custom_formatter和jqGrid中的一个小示例:始终显示select的可编辑列),可用于填充以下<TD>元素的元素jqGrid单元格。此外,如果要修改网格数据,jqGrid数据内的html数据将非常糟糕。在这种情况下,应修改html数据并将其发送回服务器。因此,最好的方法是将纯数据从服务器发送到jqGrid,并使用自定义格式化程序将数据格式化为html片段。
<TD>
通常,您可以使用自定义格式化程序来“解码”或“解压缩”数据。例如,如果在一列中仅包含“ Bla Bla Bla”和“ Ha Ha Ha”之类的数据,则可以发送0(而不是“ Bla Bla Bla”)和1(而不是“ Ha Ha Ha”)。在该列的自定义格式程序内部,将0和1转换回“ Bla Bla Bla”和“ Ha Ha Ha”字符串。如果您有常规的重复数据,则此方法将行不通,但可以改用next(jsonReader)方法。
jsonReader
还有另一种数据压缩方式:jsonReader作为函数使用(请参见http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#jsonreader_as_function和带有ASP.NET MVC的jquery-启用ajax Web服务)和用法jsonmap),也可以将其用作函数。这项技术稍微复杂一点,但是如果您在问题中添加当前发送的JSON数据示例和jqGrid定义示例(尤其是colModel),那么我将编写一个示例,说明如何使用jsonReader和jsonmap压缩数据。
jsonmap
colModel
更新 :在我看来,您的代码的一个地方非常令人怀疑:
Name = "<div class='showDescription' id= '" + i.id+ "'>" + i.Name + "</div>",
jqGrid将id属性添加到网格行(<tr>元素),但是您向<div>单元格(<td>元素的子<tr>元素)内部的元素添加了相同的ID手册。这会给您带来很多麻烦。不允许HTML具有双ID。
id
<tr>
<div>
<td>
对应您的主要问题,我可以写很多一般性建议,例如:
0
1
"true"
"false"
但是您可能首先想解决 特定 应用程序中的主要性能问题。为了能够改善您的特定应用程序应用程序,您应该在问题中发布有关解决方案的更多信息:
paginatedDat
Json(paginatedData)
如果没有此类信息,您将无法获得真正的利益就花钱。
更新2 :您可以在[Jqgrid3.7中]找到优化JSON数据的实际示例,但不会在Internet Explorer中显示行