一尘不染

在asp.net-mvc网站上优化json的最佳方法是什么

json

我目前在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等)上添加在一起。

另外,如果还有关于如何最大程度地减少邮件大小的其他建议,那就太好了。我猜这些解决方案会在某个时候增加客户端负载,但减少网络流量可能是值得的。


阅读 251

收藏
2020-07-27

共1个答案

一尘不染

我同意Craig Stuntz的观点:动态内容HTTP压缩的使用可能非常有效。但是,也非常有用的是减少发送的数据。

首先,您应该没有时间将HTML数据发送回jqGrid。jqGrid具有 自定义格式程序
(请参见http://www.trirand.com/jqgridwiki/doku.php?id=wiki:custom_formatterjqGrid中的一个小示例:始终显示select的可编辑列),可用于填充以下<TD>元素的元素jqGrid单元格。此外,如果要修改网格数据,jqGrid数据内的html数据将非常糟糕。在这种情况下,应修改html数据并将其发送回服务器。因此,最好的方法是将纯数据从服务器发送到jqGrid,并使用自定义格式化程序将数据格式化为html片段。

通常,您可以使用自定义格式化程序来“解码”或“解压缩”数据。例如,如果在一列中仅包含“ 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作为函数使用(请参见http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#jsonreader_as_function和带有ASP.NET
MVC的jquery-启用ajax Web服务)和用法jsonmap),也可以将其用作函数。这项技术稍微复杂一点,但是如果您在问题中添加当前发送的JSON数据示例和jqGrid定义示例(尤其是colModel),那么我将编写一个示例,说明如何使用jsonReaderjsonmap压缩数据。

更新 :在我看来,您的代码的一个地方非常令人怀疑:

Name = "<div class='showDescription' id= '" + i.id+ "'>" + i.Name + "</div>",

jqGrid将id属性添加到网格行(<tr>元素),但是您向<div>单元格(<td>元素的子<tr>元素)内部的元素添加了相同的ID手册。这会给您带来很多麻烦。不允许HTML具有双ID。

对应您的主要问题,我可以写很多一般性建议,例如:

  • 最好将boolean作为01代替发送"true""false"以减少数据量。
  • 如果您的网格中有id数据,则可以使用键列选项(请参阅http://www.trirand.com/jqgridwiki/doku.php?id=wiki:colmodel_options)在JSON数据中仅发送一次id值。
  • 以最紧凑的格式yy-md传输日期值,并将其转换为您希望在客户端使用的日期格式方面的文本格式。
  • 等等

但是您可能首先想解决 特定 应用程序中的主要性能问题。为了能够改善您的特定应用程序应用程序,您应该在问题中发布有关解决方案的更多信息:

  • jqGrid定义包括完整的colModel定义(与asp.net mvc网站上的服务器端JSON和jqGrid loadComplete之间的长时间延迟不同)
  • 数据转储paginatedDat,您将返回的数据Json(paginatedData)或更好的JSON数据发送给客户端(例如,您可以从Fiddler http://www.fiddler2.com/fiddler2/复制数据)
  • 您使用的jqGrid,jQuery和jQuery UI的版本信息
  • 有关数据模型和数据库的更多信息也可能会有所帮助

如果没有此类信息,您将无法获得真正的利益就花钱。

更新2 :您可以在[Jqgrid3.7中]找到优化JSON数据的实际示例,但不会在Internet
Explorer中显示行

2020-07-27