状况
我在我的项目中使用Trirand JQGrid进行MVC [服务器端]。
我在一张桌子上有超过5万条记录。
我通过调用这段代码加载数据。这就是提供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请求。
问题
我不想在页面加载事件上一起加载5万条记录,因为它会杀死jqgrid。
如果我在数据库中编写存储过程以请求显示特定页面,那么它将仅加载myviewmodel集合中的该页面。
单击下一页时,如何从数据库中即时获取页面。这在jqgrid中甚至可能吗?
情况2
基于来自VIJAY和MARK的答案,他们所展示的方法是绝对正确的,但是在这里,MVC的JQGRID设置了DATAURL属性以进行方法调用。在这种情况下,它是IncidentGridRequest。
如果点击网格下一页或上一页时如何发送页码?
incidentModel.IncidentGrid.DataUrl = Url.Action("IncidentGridRequest")
public JsonResult IncidentGridRequest()
{
}
答案 0 :(得分:6)
为您的网格提供结果的控制器操作可以接受来自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。
编辑:要处理您的分页问题,您应该计算查询中的总记录数并将该值传递给网格,Ex
int totalRecords = myviewmodel.Count();
然后你会把它作为jSon值传递给你的网格。前
var jsonData = new
{
total = (totalRecords + rows - 1) / rows,
page = page,
records = totalRecords,
userdata = new {SearchResultsFound = searchResultsFound},
rows = (
......
答案 1 :(得分:2)
是的,例如,如果您要接受要在名为 page
的变量中转向的页码,并且在变量 {{中具有页面大小1}} 然后:
pageSize
会为您提供 IEnumerable<myIndexViewModel> myviewmodel = allincidents.Select(x => new myIndexViewModel
{
IncidentRequestStatus = x.RequestStatus,
RequestByUserName = x.RequestByUserName,
Subject = x.Subject
}).Skip((page-1)*pageSize).Take(pageSize));
大小的记录。
答案 2 :(得分:1)
ASP.NET MVC的Trirand jqGrid在IQueryable
方法中使用JqGrid.DataBind()
接口来实现pagin,排序和过滤。
因此,关键是使用数据源,它在数据库级别处理这些类型的操作(通过以仅仅获取所需数据的方式对数据库进行SQL查询)。所有主要的ORM都有这种支持,包括:LINQ-2-SQL,实体框架,NHbiernate,LLBLGen。
您只需使用其中一种技术,并将所需的上下文直接传递给JqGrid.DataBind()
方法(无需像在样本中那样手动提取数据)。
答案 3 :(得分:0)
使用PagedList库(来自Nuget)更简单的方法。 Joseph Schrag
有一个有用的博客 public JsonResult Users(int PageNo, int Rows)
{
var UserList = db.Users.Select(t => new
{
t.UserId,
t.Username,
t.Firstname,
t.Lastname,
t.Designation,
t.Country,
t.Email
}).OrderBy(t => t.UserId);
var pagedUserList = UserList.ToPagedList(PageNo, Rows);
var results = new
{
total = pagedUserList.PageCount, //number of pages
page = pagedUserList.PageNumber, //current page
records = UserList.Count(), //total items
rows = pagedUserList
};
return new JsonResult() { Data = results, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}