JQGrid加载大量数据

时间:2013-01-18 06:11:02

标签: asp.net-mvc asp.net-mvc-3 jqgrid

状况

我在我的项目中使用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()
        {
         }

4 个答案:

答案 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 };
    }