您的位置:首页 > 其它

MVC学习(四)几种分页的实现(2)

2014-01-03 20:13 260 查看
  在第一种分页方式中,仅仅实现了分页,但并未有体现出MVC的优势,没有体现出泛型编程思想,尤其在数据量很大的时候,分页十分缓慢,除此之外,还没有实现很好的封装,不是一个通用方法。

  因此,我希望只要传入数据源以及页码数(采用泛型编程)便可以实现分页功能,且使用十分的方便。

  下面就讲讲我的一些理解。

  在泛型编程中,数据容器一般继承了IQueryable或者IEnumerable接口(此例中,数据源暂时继承了这两种接口)。

  为了调用方法方便,我决定对这两个接口写扩展方法。

  首先为了实现数据分页功能,我们常常需要考虑以下六个属性
  总页数(TotalPage)、总数据量(TotalCount)、当前页码(PageIndex)、

  一页显示数据多少(PageSize)以及上一页或者下一页(IsPreviousPage/IsNextPage)。

  因此,基于对象属性,抽象出接口(IPageList),分页方法必须继承并实现这些属性。

  接口IPageList代码如下

public ActionResult FY2(string GoFlag, string PageIndex)
{
int PageSize = 5;
int TotalCount = LzsDB.MyTestPages.Count();//获得此数据表中数据记录数
double PageCount = Math.Ceiling((double)TotalCount / (double)PageSize);//获得总页数
int NowPageIndex = 1;
if (!string.IsNullOrEmpty(PageIndex))
{
int ErrorPageIndex = 1;
if (!Int32.TryParse(PageIndex, out ErrorPageIndex))//如果不能转换成整数,则默认当前页码为1
{
PageIndex = "1";
}

NowPageIndex = Convert.ToInt32(PageIndex);//
}
GoFlag = string.IsNullOrEmpty(GoFlag) ? "First" : GoFlag;

switch (GoFlag)
{
case "First":
ViewBag.P2Index = 1;
NowPageIndex = 1;
break;
case "Pre":

ViewBag.P2Index = Convert.ToInt32(PageIndex) - 1;
NowPageIndex = Convert.ToInt32(PageIndex) - 1;

break;
case "Next":
ViewBag.P2Index = Convert.ToInt32(PageIndex) + 1;
NowPageIndex = Convert.ToInt32(PageIndex) + 1;

break;
case "Last":
ViewBag.P2Index = PageCount;
NowPageIndex = Convert.ToInt32(PageCount);
break;
}

var MyTestPagesList = LzsDB.MyTestPages.OrderBy(a => a.Id);
return View(MyTestPagesList.ToPagedList(NowPageIndex, 5));
}


FY2(string GoFlag, string PageIndex)
  分页后的效果如下

  


  我插入了120万条数据,每页显示5条,在本机测试,分页还是蛮快的。

  


  整个源程序点此下载,本例子是vs2010,MVC3,配置好数据库便可运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: