C#MVC2 Jqgrid - 做服务器端分页的正确方法是什么?
问题描述:
我有一个jqgrid,其中数据库表有几千行,但jqrid一次只显示15个。C#MVC2 Jqgrid - 做服务器端分页的正确方法是什么?
它应该很快显示(查询15行并不需要很长时间)。但相反,它需要10 - 20秒,这表明它每次都检索整个表格。
网格的定义如下:
$("#Products").jqGrid({
url: url, mtype: "get", datatype: "json", jsonReader: {
root: "Rows", page: "Page", total: "Total", records: "Records", repeatitems: false,
userdata: "UserData",id: "Id"},
colNames: ["Product Id","Product Code", ... etc ],
colModel: [{ name: "Id", ... etc}],
viewrecords: true, height: 400, width: 800, pager: $("#jqgPager"),
rowNum: 15, rowList: [50, 100, 200],
autowidth: true, multiselect: false
并且服务器侧(MVC2动作)执行此操作:
var model = (from p in products
select new
{
p.Id, p.ProductCode, p.ProductDescription,
AllocatedQty = p.WarehouseProducts.Sum(wp => wp.AllocatedQuantity),
QtyOnHand = p.WarehouseProducts.Sum(wp => wp.OnHandQuantity)
}).AsQueryable();
JsonResult json = Json(model.ToGridData(
page, rows, orderBy, "",
new[] { "Id", "ProductCode", "ProductDescription", "AllocatedQty", "QtyOnHand" }),
JsonRequestBehavior.AllowGet);
最后的model.ToGridData扩展方法执行此:
var data =_service.GetAll();
var page = data.Skip((index) * pageSize).Take(pageSize);
list.Add(page.AsEnumerable);
而且我对有问题的地方有点遗憾:
- 我是否错误地设置了jqgrid分页选项?
- 我写了不好的LINQ,不管拉什么行?例如Sum()会导致所有行被读取?
- 我已经完成了.Skip()。拿()不正确?
- 我完全错过了其他的东西吗?
编辑
当比较我的代码张贴奥列格的例子,我可以看到我做的事情按以下顺序:
- GETALL
- 选择模型领域
- 页
Wheras Olegs样本似乎是在这orde R:
- GETALL
- 页
- 选择模型领域
所以我改变了这个更简单的实现:
public ActionResult GetProductList(int page, int rows, string sidx, string sord,
string searchOper, string searchField, string searchString)
{
List<Product> products = _productService.GetAllProducts();
int totalRecords = products.Count();
var pagedData = products.Skip((page > 0 ? page - 1 : 0) * rows).Take(rows);
var model = (from p in pagedData
select new
{
p.Id, p.ProductCode, p.ProductDescription,
Barcode = string.Empty, UnitOfMeasure = string.Empty,
p.PackSize, AllocatedQty = string.Empty,
QtyOnHand = string.Empty }).ToList();
var jsonData = new
{
total = page, records = totalRecords,
page = (totalRecords + rows - 1)/rows, rows = model
};
return Json(jsonData, JsonRequestBehavior.AllowGet);
}
但是,这有一个新的问题:
A circular reference was detected while serializing an object of type
'System.Data.Entity.DynamicProxies.Product_FA935D3899E2...
我现在可以看到的与奥列格的例子唯一的区别是,他的getAll返回IQueryable
其中我的只是List
。
答
您应该发布更完整的代码。例如,当前代码中未定义model.ToGridData
。如何从输入参数中识别index
等等也不清楚。只有model.ToGridData()
可以说你的程序产生的输出是否与你定义的jsonReader
相对应。
我建议你看看this旧的答案,其中使用了分页和排序。在one more answer中,您将找到更多对代码示例的引用。
谢谢,我已经根据第一个例子编辑我的问题。顺便说一句,在'var jsonData ='语句中'total ='重复了两次。 – 2010-11-17 22:24:37
@JK:可能你应该使用'var jsonData = new {...,rows = model};'而不是'var jsonData = new {...,rows = pagedData};'?目前你不使用你只分配的'model'变量。如果它没有解决你的问题,你应该写在你收到异常的哪一行。 – Oleg 2010-11-17 22:38:45
当然是的,我的错误......'rows = model'就是我想要的。它现在返回数据,我需要检查它是否正常工作,并做一些时间测试等。 – 2010-11-17 23:04:58