我目前在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等)放在一起。
此外,如果对如何最小化我的邮件大小有任何其他建议,那将是很好的。我想在某些时候这些解决方案会增加客户端负载,但减少网络流量可能是值得的。
答案 0 :(得分:8)
我同意Craig Stuntz:使用动态内容的HTTP压缩非常有效。但非常有用的还可以减少发送的数据。
首先,您应该没有时间将HTML数据发送回jqGrid。 jqGrid具有自定义格式化程序(请参阅http://www.trirand.com/jqgridwiki/doku.php?id=wiki:custom_formatter和jqGrid: 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_function和jquery 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"
来减少数据。但您可能首先要在特定应用程序中解决主要性能问题。为了能够改进您的特定应用程序应用程序,您应该在您的问题中发布有关您的解决方案的更多信息:
"false"
的数据转储,您将{J}数据发送给客户端paginatedDat
或更好地返回(例如,您可以从Fiddler http://www.fiddler2.com/fiddler2/复制数据)如果没有这类信息,你可以花掉你的赏金而不会给你带来实实在在的好处。
中找到的优化JSON数据的实际示例答案 1 :(得分:1)
将您的服务器设置为ZIP responses。这将处理重复的数据。
答案 2 :(得分:1)
根据你的建议,如果你想在客户端附加html,请查看jqgrid的Formatter:
http://www.secondpersonplural.ca/jqgriddocs/_2kn0mlo1p.htm
-
另外,虽然我猜测每页返回200多条记录的商业原因,服务器端分页是一种选择吗?