asp.net mvc 无刷新高效分页

时间:2022-11-28 19:15:09

分页的原理是将本页的数据通过查询拿出来,当数据很巨大时,不用全部拿出来,影响效率。

第一步拿数据:

sql server下的分页查询:

select * from  (select *,Row_Number() over(order by id)  nums from tableName) tableName where  nums > 2 and nums < 10

检索 2-10的数据,这里必须用到子查询。因为设置 nums的条件时,nums必须为表里有的字段。

mysql下的分页查询:

SELECT *  FROM USER LIMIT 2,5

检索从3开始的5条数据,比起ms sql简单了点

 

接下来需要封装一个分页类,将分页用到的数据封装进去。封装的数据有要显示的多条数据,所以这个类就继承List<T>

  public class PageinatedList<T> : List<T>
{
private int pageIndex;
private int pageSize;
private int totalCount;
private int totalPages;


/// <summary>
/// 当前页码
/// </summary>
public int PageIndex
{
set { pageIndex = value; }
get { return pageIndex; }
}

/// <summary>
/// 每页个数
/// </summary>
public int PageSize
{
set { pageSize = value; }
get { return pageSize; }
}
/// <summary>
/// 数据总数
/// </summary>
public int TotalCount
{
set { totalCount = value; }
get { return totalCount; }
}
/// <summary>
/// 可分页数
/// </summary>
public int TotalPages
{
set { totalPages = value; }
get { return totalPages; }
}

public PageinatedList(IQueryable<T> table, int pageIndex, int pageSize)
{
this.PageIndex = pageIndex;
this.PageSize = pageSize;
this.TotalCount = table.Count();
this.TotalPages = TotalCount / PageSize;
this.AddRange(table.Skip(pageIndex*PageSize).Take(PageSize));

}
}

这里我用到的是linq查询,linq查询返回的是一个 IQueryable<T> 接口 下的一个子类。所以我这里构造函数就传进去一个IQueryable<T> table

 

用linq查询出来,然后封装进分页类。返回给页面。这样就能拿到数据和分页用到的属性

        public ActionResult Index()
{
var select = from c in ent.学生 orderby c.学号 select c;
var pageinated = new PageinatedList<学生>(select,0,10);
return View(pageinated);
}

public ActionResult Pages(int page)
{
var select = from c in ent.学生 orderby c.学号 select c;
var pageinated = new PageinatedList<学生>(select, page, 10);
return View(pageinated);
}
 function changePage(i) {
$.post(
"Pages?Page=" + i, function (data) {
$(
"#mytr").html(data);
});
}

通过ajax来改变数据。