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

标签 asp.net-mvc performance json optimization jqgrid

我目前在 asp.net mvc 站点上使用 jqgrid,我们的网络(内部应用程序)非常慢,并且似乎需要很长时间才能加载网格(问题既在于网络,也在于解析,渲染)

我正在尝试确定如何最大限度地减少发送给客户端的内容,以使其尽可能快。

这是我的 Controller 将数据加载到网格中的操作的简化 View :

[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_formatterjqGrid: Editable column that always shows a select 中的一个小示例),可用于填充 jqGrid 单元格的 <TD> 元素。此外,如果你想修改网格数据,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”字符串。如果您有一般重复数据,此方法将不起作用,但您可以使用下一个(jsonReader)方法。

还有另一种数据压缩方式:将 jsonReader 作为函数使用(请参阅 http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#jsonreader_as_functionjquery with ASP.NET MVC - calling ajax enabled web service )以及使用 jsonmap (例如,请参阅 Mapping JSON data in JQGrid ),后者也可以用作函数。这种技术有点复杂,但是如果您在问题中添加当前发送的 JSON 数据的示例以及 jqGrid 定义的示例(尤其是 colModel ),我将编写一个示例如何使用 jsonReaderjsonmap 来压缩数据.

更新:在我看来,你的代码的一个地方非常可疑:

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

jqGrid 将 id 属性添加到网格行( <tr> 元素),但您手动将相同的 id 添加到单元格内部的 <div> 元素( <td> 元素,它是 <tr> 元素的子元素)。这会给你带来很多问题。 HTML 不允许有双 id。

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

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

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

如果没有此类信息,您可能会花掉您的赏金,而不会为您带来真正的好处。

更新2:您可以在Jqgrid 3.7 does not show rows in internet explorer中找到优化JSON数据的实际示例

关于asp.net-mvc - 在 asp.net-mvc 站点上优化 json 的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2999955/

相关文章:

asp.net-mvc - 网站结构

performance - 相同代码的执行之间的 CPU 时间是否应该始终相同?

css - <img/> 与 background-image (css) 在性能上的对比

performance - 如何在 Haskell 中优化数值库的速度

C#通过ID访问JSON内容

asp.net-mvc - MVC 优于 MVP 的优势

javascript - mvc.net 4 ajax 使用操作 httpGet 不适用于 httpPost

javascript - 如何使用 Axios 将 JSON 数据正确发送到 Rails 服务器,以正确匹配所需的 Rails 参数哈希?

javascript - 在javascript中编码/解码html标签

.net - MVC解决方案结构