情况
我在我的项目中使用 Trirand JQGrid for MVC[服务器端]。
我在一个表中有超过 50 万条记录。
我通过调用这段代码来加载数据。这就是 500000 条记录集合的原因。
IEnumerable<myIndexViewModel> myviewmodel= _allincidents.Select(x => new myIndexViewModel
{
IncidentRequestStatus = x.RequestStatus,
RequestByUserName = x.RequestByUserName,
Subject = x.Subject
});
gridModel.JqGrid.DataBind(myviewmodel.AsQueryable());
JQgrid 可以很好地处理我点击的每个下一页的基于 json 的 ajax 请求。
问题
我不想在页面加载事件上加载 50 万条记录,因为它会杀死 jqgrid。
如果我在数据库中编写一个存储过程来请求显示特定页面,那么它只会加载 myviewmodel 集合中的该页面。
当单击下一页时,如何从数据库动态获取页面。这在 jqgrid 中可能吗?
情况2
根据 VIJAY 和 MARK 的答案,他们所展示的方法是绝对正确的,但在这里,MVC 的 JQGRID 设置 DATAURL 属性来进行方法调用。在本例中是 IncidentGridRequest。
单击网格下一页或上一页时如何发送页码?
incidentModel.IncidentGrid.DataUrl = Url.Action("IncidentGridRequest")
public JsonResult IncidentGridRequest()
{
}
最佳答案
将为网格提供结果的 Controller 操作可以接受来自 jqGrid 的一些额外信息。
public ActionResult GetGridData(string sidx, string sord, int page, int rows, bool _search, string filters)
您感兴趣的主要部分是页面、行(sidx 用于列排序,sord 用于排序顺序,_search 如果在网格上进行了搜索,如果是,则过滤器包含搜索信息)
当您生成结果时,您应该能够
IEnumerable<myIndexViewModel> myviewmodel = allincidents.Select(x => new myIndexViewModel
{
IncidentRequestStatus = x.RequestStatus,
RequestByUserName = x.RequestByUserName,
Subject = x.Subject
}).Skip((page - 1) * rows).Take(rows)
PS。我不确定您使用 IEnumberable 是否会从数据库中移动大量数据,但当您为 jqGrid 生成此数据子集时,您可能希望使用 IQueryable。
编辑:要处理分页问题,您应该计算查询中的总记录数并将该值传递给网格,例如
int totalRecords = myviewmodel.Count();
然后您会将其作为 json 值传递到网格。例如
var jsonData = new
{
total = (totalRecords + rows - 1) / rows,
page = page,
records = totalRecords,
userdata = new {SearchResultsFound = searchResultsFound},
rows = (
......
关于asp.net-mvc - JQGrid 加载大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14393350/