ASP.NET MVC分页的实现(上)-阿里云开发者社区

开发者社区> 技术小甜> 正文

ASP.NET MVC分页的实现(上)

简介:
+关注继续查看


ASP.NET中,GridView控件本身就带有分页的功能,只要把当前页面的索引值赋给GridViewPageIndex就可以实现了分页,至于数据怎么分页,全都由GridView封装起来了。

ASP.NET MVC中分页的实现就只能靠自己来设计了。首先来说一下分页的原理。现在有一个张news表,中间有很多信息,我们假设一页显示5条记录,这样,页面数量=总记录数/5;这里,如果出现小数,得进位取整。如比总记录和数为51,那么分的页面数量是11,最后一页只有一条记录。好,有这样一个思路后,现在就来做ASP.NET MVC中的分页了。
1、  数据库和表
创建一个Data_Company的数据库,建一张news表,表结构如下图:
ID是主键,并助是自动增长列。
2、  现在,我们用O/R Designer来创建news表的LINQ To SQL的实体类。
创建一个名为MvcCompanyASP.NET MVC Web Application项目,然后选中Models,右键,“添加”,“新建项”,选中C#中的“数据”,如下图:
选择“LINQ  to SQL类”,名称设为“CompanyData.dbml”,然后“添加”。
打开“服务器资源管理器”,创建连接,展开表,找到news表,拖到CompanyData.dbml的左边表视图区(注:.dbml视图左边是SQL表和SQL视图区,右边是SQL存储过程和SQL函数区),效果如下图:
在“解决方案资源管理器”下的,“Models”多了三个文件,CompanyData.dbml,展开它,会有CompanyData.dbml.layoutCompanyData.designer.cs,前者是CompanyData.dbml视图的一些信息(比如news表在的坐标等信息),后者是news实体类及Data_Company数据库的类,在数据库类中聚合了news实体类。
3、  添加news列表类。因为一个news实体类,一次只能表示一条记录,如果呈现一个news表中的数据,最好定义一个集合类来存临时来存放news记录的集合。
类的实现如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
 
namespace MvcCompany.Models
{
    public class NewList<T> : List<T>
    {
        /// <summary>
        /// 页面索引值
        /// </summary>
        public int PageIndex { getprivate set; }
        /// <summary>
        /// 每页记录的数量
        /// </summary>
        public int PageSize { getprivate set; }
        /// <summary>
        /// 记录总条数
        /// </summary>
        public int TotalCount { getprivate set; }
        /// <summary>
        /// 共有的页数和
        /// </summary>
        public int TotalPages { getprivate set; }
 
        public NewList(IQueryable<T> source, int pageIndex, int pageSize)
        {
            PageIndex = pageIndex;
            PageSize = pageSize;
            TotalCount = source.Count();
            // 进上去取整( 总记录条数/一面记录的条数)
            TotalPages = (int)Math.Ceiling(TotalCount / (double)pageSize);           
            this.AddRange(source.Skip(pageIndex * pageSize).Take(PageSize));
        }
        /// <summary>
        /// 是否存在前续页
        /// </summary>
        public bool HasPreviousPage
        {
            get { return (PageIndex > 0); }
        }
        /// <summary>
        /// 是否存在后续页
        /// </summary>
        public bool HasNextPage
        {
            get { return (PageIndex + 1 < AllPages); }
        }
    }
}
这里,我们实现了一个泛型的集合列表NewList(当然,这里的本质上可以当其他实体类的集合列表),在这个类中间,有四个字段,访问修饰符都是public的,分另为:
PageIndex:当前页面的索引值
PageSize:每个页面的记录的条数
AllCount:记录的总条数
AllPages:共有的页面总数
 
NewList 构造函数中,有如下代码:
public NewList(IQueryable<T> list, int pageIndex, int pageSize)
{
1 PageIndex = pageIndex;
            2 PageSize = pageSize;
            3 AllCount = source.Count();
            4 AllPages = (int)Math.Ceiling(AllCount / (double)pageSize);
            5 this.AddRange(list.Skip(PageIndex * PageSize).Take(PageSize));
}
构造函的参数有三个,一个是list,就是实体类的一个集合,还有就是页面索引值和每个页面的记录条数。
12代码很容易理角,第3行代码是得到列表的总记录条数,第4行代码,就完成了我们在开始时分析的分页实现的公式:页面数量=总记录数/每页记录数,其中Math.Ceiling就是把小数部分进到整数的函数。
最关键的是第5行代码,首先看Skip(PageIndex*PageSize),页面索引值乘上每页记录数,得到是当前页面以前的所有记录数,Skip是跳过这些记录,而得到后面的所有记录,Take(PageSize)是得到PageSize条数的记录,比如,我们想要第三页的记录,这个页面的索引值为2(因为索引值从0开始)PageIndex=2,每页显示5条记录,PageSize=5,就是要跳过list中的前10条记录,然后再取前5条记录,即取list中的第11条到第15条记录,也就是第3页的记录了。
在这里,微软提供了SkipTabke函数,让我们做起分页来,得心应手。
接下来是this.AddRange()函数,可以把批量的数据放到当前集合中(因为NewList本身就是一个集合)。
代码的后半部分是两个属性:
        public bool HasPreviousPage
        {
            get { return (PageIndex > 0); }
        }
        public bool HasNextPage
        {
            get { return (PageIndex + 1 < AllPages); }
        }
这两个属性是为页面显示“上一页”和“下一页”,因为当我们显示第一页的时候,“上一页”是不需要显示的,如果最后一页,是没有“下一页“的,所以在这里定义了两个属性,来判断是否有上一页和下一页。
先看HasPreviousPage属性,如果PageIndex是大于0的,说明不是在第一页,所以就反回true,如果小于等于0(在这里小于0是没有意思义的,因为页面的索引值最小是0),说明是第一页,所以返回是false
再看HasNextPage属性,因为页面索引值的最大数,与页面的最大数差1(索引从0开始的原因),所以当PageIndex+1小于AllPages时,说没有没到最后一页,返回值是true,如果PageIndex+1大于等于AllPages时(大于也没有意义),说明是最后一页,返回值为false
4、  添加NewsController。选中Controller,右键添加一个NewsController 的Controller
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using MvcCompany.Models;
using System.Configuration;
namespace MvcCompany.Controllers
{
    public class NewsController : Controller
    {       
        DataClassesDataContext DCDC;
        int pageSize;
        public NewsController()
        {
            DCDC = new DataClassesDataContext();
            pageSize = Convert.ToInt32(ConfigurationManager.AppSettings["pagesize"]); //每个页面的数量存放在web.configappsetting里的pagesize节中,值为5
        }
        public ActionResult Index(int? page)
        {          
            var NewsList = DCDC.news.Select(newss=>newss);
            var paginatedNews = new NewList<news>(NewsList, page ?? 0, pageSize); //实现分页功能
            return View(paginatedNews);
        }
 
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(FormCollection formValues)
        {       
            int? index = int.Parse(formValues.GetValue("pageindex").AttemptedValue);
            int page = index ??0 ;         
            var NewsList = DCDC.news.Select(newss => newss);
            var paginatedNews = new NewList<news>(NewsList, page, pageSize); //实现分页功能
            return View(paginatedNews);
        }
    }
}
关于两个Index重载,我们在设计完Views再讨论。
















本文转自桂素伟51CTO博客,原文链接:http://blog.51cto.com/axzxs/200134 ,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10069 0
艾伟_转载:一个MVC分页Helper
  本人写的一个分页Helper,支持普通分页(也就是,首页、上一页、下一页、末页等),综合分页(普通分页和数字分页的综合)。下面是分页效果: 分页代码: PagerHelper.cs 代码   1 using System;  2  using System.
619 0
Mysql分页查询通用存储过程 - 阿影的黄金时代 - 博客频道 - CSDN.NET
来源:http://blog.csdn.net/fcrpg2005/article/details/1522713#1536434-hi-1-63006-42d97150898b1af15ddaae52f91f09c2
664 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10882 0
EF 之 MVC 排序,查询,分页 Sorting, Filtering, and Paging For MVC About EF
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。    十年河东十年河西,莫欺少年穷    学无止境,精益求精    上篇博客我们学习了EF CodeFirst增删改查之‘CRUD’,今儿,我们来探讨下MVC下的EF 排序、查询、分页操作    在此,本人先从分页说起    话说,做过webForm项目的程序员用AspNetPage.
1196 0
【开源】QuickPager ASP.NET2.0分页控件 v2.0.0.2版本。
下载地址:http://files.cnblogs.com/jyk/Page2.0.0.2_080701.rar 这回只有 dll文件。请把包里的文件拷贝到bin目录下。 道歉。 由于v2.0.0.1有些地方没有说说清楚,给一些朋友带来了一些麻烦,在这里向大家道歉,对不住大家了。
896 0
QuickPager asp.net 分页控件、表单控件等自定义控件下载 和介绍 【2009.09.07更新】
  最新下载地址: 自然框架的源代码、Demo、数据库、配置信息管理程序下载(2010.01.25更新)     QuickControl web控件集包含的控件 QuickControl web控件集——基本控件: 控件名称 说明 详细介绍 MyTextBox ...
961 0
Struts2获取easyUI datagrid 分页参数page和rows
Struts2获取easyUI datagrid 分页参数page和rows   用pageHelper分页时,只要是能够获取前台传来的两个参数page和rows基本就完成了很大一部分。 获取方法:定义两个变量page和rows,设置对应的getter,setter方法,在方法中直接获取就能打得。
1175 0
+关注
10146
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载