5

情况

我在我的项目中将 Trirand JQGrid 用于 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()
        {
         }
4

4 回答 4

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。

编辑:要处理您的分页问题,​​您应该计算查询中的总记录数并将该值传递给网格,例如

int totalRecords = myviewmodel.Count();

然后稍后您会将其作为 json 值传递给您的网格。前任

    var jsonData = new
    {
        total = (totalRecords + rows - 1) / rows,
        page = page,
        records = totalRecords,
        userdata = new {SearchResultsFound = searchResultsFound},
        rows = (
        ......
于 2013-01-21T13:59:26.363 回答
2

是的,例如,如果您在一个名为的变量中接受要转到page的页码,并且在变量中具有页面大小,pageSize那么:

IEnumerable<myIndexViewModel> myviewmodel = allincidents.Select(x => new myIndexViewModel
            {

                IncidentRequestStatus = x.RequestStatus,
                RequestByUserName = x.RequestByUserName,
                Subject = x.Subject

            }).Skip((page-1)*pageSize).Take(pageSize));

会给你大小的记录pageSize给你。

于 2013-01-21T12:29:56.643 回答
1

Trirand jqGrid for ASP.NET MVCIQueryable在方法内部使用接口JqGrid.DataBind()来实现分页、排序和过滤。

所以这里的关键是使用数据源,它在数据库级别处理这些类型的操作(通过以只获取所需数据的方式对数据库进行 SQL 查询)。所有主要的 ORM 都有这种支持,这包括:LINQ-2-SQL、实体框架、NHbiernate、LLBLGen。

您只需要使用其中一种技术,并将所需的上下文直接传递给JqGrid.DataBind()方法(无需像在示例中那样手动提取数据)。

于 2013-01-21T14:46:09.407 回答
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 };
    }
于 2013-03-17T11:28:10.700 回答