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

时间:2010-06-08 18:01:52

标签: asp.net-mvc performance json optimization jqgrid

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

此外,如果对如何最小化我的邮件大小有任何其他建议,那将是很好的。我想在某些时候这些解决方案会增加客户端负载,但减少网络流量可能是值得的。

3 个答案:

答案 0 :(得分:8)

我同意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”而不是“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),我会写一个例子,你可以如何使用{{1 }和jsonReader来压缩您的数据。

更新:我觉得你的代码中有一处非常怀疑:

jsonmap

jqGrid将Name = "<div class='showDescription' id= '" + i.id+ "'>" + i.Name + "</div>", 属性添加到网格行(id元素),但是您将手动相同的id添加到单元格(<tr>元素内的<div>元素,它是<td>元素的子元素。这可能会让你遇到很多问题。 HTML不允许使用双重ID。

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

  • 最好将布尔值设为<tr>0而不是1"true"来减少数据。
  • 如果你的网格中有id数据,你可以使用key column选项(参见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数据的实际示例

答案 1 :(得分:1)

将您的服务器设置为ZIP responses。这将处理重复的数据。

答案 2 :(得分:1)

根据你的建议,如果你想在客户端附加html,请查看jqgrid的Formatter:

http://www.secondpersonplural.ca/jqgriddocs/_2kn0mlo1p.htm

-

另外,虽然我猜测每页返回200多条记录的商业原因,服务器端分页是一种选择吗?