leo*_*ora 3 asp.net-mvc optimization performance json 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);
}
Run Code Online (Sandbox Code Playgroud)
所以我正在构建一个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片段.
通常,您可以使用自定义格式化程序来"解码"或"解压缩"数据.例如,如果列中只有"Bla Bla Bla"和"Ha Ha Ha"等数据,则可以发送0而不是"Bla Bla Bla"而不是"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和jquery与ASP.NET MVC - 调用ajax启用Web服务)和使用jsonmap
(例如,参见JQGrid中的映射JSON数据),它也可以用作函数.这种技术稍微复杂一些,但如果你在问题中添加一个当前发送的JSON数据的例子和jqGrid定义的例子(特别是colModel
),我将编写一个如何使用jsonReader
和jsonmap
压缩数据的例子.
更新:我觉得你的代码中有一处非常怀疑:
Name = "<div class='showDescription' id= '" + i.id+ "'>" + i.Name + "</div>",
Run Code Online (Sandbox Code Playgroud)
jqGrid将id
属性添加到网格行(<tr>
元素),但是您将手动相同的id添加到<div>
单元格内部的元素(<td>
元素,即元素的子<tr>
元素).这可能会让你遇到很多问题.HTML不允许有双重ID.
对应你的主要问题我可以写出很多一般的建议,比如:
0
或1
代替"true"
和"false"
减少数据.但您可能首先需要解决特定应用程序中的主要性能问题.为了能够改进您的特定应用程序应用程序,您应该在问题中发布有关您的解决方案的更多信息:
paginatedDat
您返回的数据转储Json(paginatedData)
或更好的JSON数据发送到客户端(您可以从Fiddler复制数据http://www.fiddler2.com/fiddler2/)没有这种信息,您可以花费您的赏金而不会给您带来实际利益.
更新2:您可以在Jqgrid 3.7中找到的JSON数据优化的实际示例不显示Internet Explorer中的行