ASP.NET中MvcPager(分页的第三方插件)的用法,献给小白(本人也小白一个)

 在ASP.NET编程中,我们常常会使用到列表数据,但由于网页的大小限制,常常有分页的需求,手动分页是很痛苦的,从SQL语句到排版,控制页数,控制跳转,控制这控制那。烦的狠,下面给大家介绍一种可以自动计算出分页并一行代码生成页脚的DLL。

       IDE:vs2012语言:C# 项目类型:ASP.NET MVC4 WEB应用程序

      拿一个我做的书店的系统为例,采用的是三层架构,另加通用和实体两个程序集。首先要在你的web层添加引用,引用这个MvcPager.DLL,然后顺便把那个pagerstyles.css拷贝到你的项目的装css的文件夹下,最后一步,在web.config中中添加一个命名空间,省得用一次就要前面加上命名空间,这样一次解决。没记错就只这样添加的,如果有错误,就去看看那个dll的命名空间

     下面就要使用这个玩意了。

    还是拿我做的书店来举例。我要做一个图书列表页,那么来装这个图书列表的数据就是一个实体,首先在实体层建立两个类,一个是BookEntity,对应的是MSSQL中的books表中的各个字段。还有一个是BookPageInfoEntity,其中设置了四个属性,分别是TotalCount,PageCount,PageIndex,BookList,前三个都是整形的,都是int类型的,最后一个是一个图书列表,数据类型是List,装了一大堆的书。实体类建好之后,就要开始写控制器了。在Book控制器里定义一个BookManager的动作方法,下面只列出拿到这个图书列表数据的关键代码。建一个名字叫BookList的视图,采用Razor的视图引擎,不用母板,一切从简。。视图中先声明模型(强类型)@model PagedList(这个PagedList就是MvcPager中的一个类,其中放的是你要展示的类型,即我们BookEntity,而不是BookPageInfoEntity),然后判断一下

如果Model不是空,就可以使用了,不然会报空指针异常。PageList是继承List的,所以只要判断Count属性大于0就不是空的了。然后在视图中展示的代码就可以省略了吧。你想怎么写都可以了,Model.Title什么的都上吧。骚等,另起一段,喝口水。

     下面就是比较关键的取数据的阶段了。首先要清楚我们取的是什么数据,既然是分页,就要不光取出来Book的一个集合,还要附带总数,页大小,页索引等信息,那就要先定义一个BookPageInfoEntity的实例,然后通过查数据库,把这个实例填满数据。然后就定义一个PageListresult = new  PageList(a,b,c,d);他需要四个参数,

public PagedList(IEnumerable currentPageItems, int pageIndex,int pageSize, int totalItemCount);
 public PagedList(IQueryable currentPageItems, intpageIndex, int pageSize, int totalItemCount);

这是其中的两个构造器的原型,第一个是要一个数据集,实现了IEnumerable或者IQueryable的接口,第二个要页索引,第三个要页大小,第四个参数要一个总数。到这里,就算把数据取出来了。然后把result返回给视图就好了。

从头撸一遍过程:

               BookPageInfoEntity booklist = new BookPageInfoEntity();
               booklist = BookBLL.QueryBookListWithPage(pageIndex, pageSize,searchType,key);
               ViewBag.SearchType = searchType;
               ViewBag.SearchKey = key;
               PagedList result = new PagedList(booklist.BookList, pageIndex,pageSize, booklist.TotalCount);
               return View("BookList", "_LayoutPage1",result); 

       其中ViewBag那两句不用管,是记录搜索的关键字和搜索的类型的。

视图声明的代码:(在BookList.cshtml中)

@model PagedList


@section Script{
    @{
       Html.RegisterMvcPagerScriptResource();
    }
}

列一段界面展示的代码:

@for (int i = 0; i < Model.Count; i++)
           {
               


                   
                   
                   
                   
                   
               
           }

       (@model PagedList声明之后,在其他部分,Model就可以代替PagedList了)

      sorry,忘记了,这个Script的部分是要放在母板页中注册的,如果木有模板页,就放在本页注册。抱歉抱歉。

然后是一键生成页脚的:(真是超方便,都封装好了。)

       @Html.Pager(Model, new PagerOptions
   {
      ShowPageIndexBox = true,
      PageIndexBoxType = PageIndexBoxType.DropDownList,
      ShowGoButton = false,
      AutoHide = false,
      NumericPagerItemCount = 5
   },
           new { id = "menepager" })

下面介绍说一下查数据的方法。

我是通过三层调用的,BLL层几乎没写啥。贴一下DAL层的代码。(BLL层就是直接参数拿过来直接跳到DAL,还是贴一下代码吧。就一行       

public static BookPageInfoEntity QueryBookListWithPage(intpageIndex, int pageSize, string searchType,string key)
       {
           return BookDAL.QueryBookListWithPage(pageSize, pageIndex,searchType,key);
       })

下面这个就很重要了,是DAL层中的代码:

public static BookPageInfoEntity QueryBookListWithPage(intpageSize, int pageIndex, string searchType,string key)
       {
           string sql = @"SELECT @totalCount = COUNT(*)
                          FROM   dbo.Books AS b
                                 INNER JOIN dbo.Publishers AS p ON PublisherId = p.Id
                          WHERE  1 = 1 #condition#
                          SELECT TOP ( @pageSize)
                                 *
                          FROM   (SELECT   ROW_NUMBER() OVER ( ORDER BY b.Id ) AS RowId ,
                                             b.Id,
                                             b.Title ,
                                             p.Name,
                                             b.Author,
                                             b.ContentDescription
                                   FROM     dbo.Books AS b
                                             INNER JOIN dbo.Publishers AS p ON PublisherId = p.Id
                                             INNER JOIN dbo.Categories AS c ON CategoryId = c.Id
                                   WHERE    1 = 1 #condition#
                                 ) AS A
                          WHERE  A.RowId > @pageSize * @pageIndex";
           List paras = new List();
           paras.Add(new SqlParameter("@pageSize", pageSize));
           paras.Add(new SqlParameter("@pageIndex", pageIndex - 1));
           paras.Add(new SqlParameter("@totalCount", 0));
           paras[2].Direction = ParameterDirection.Output;
           int totalCount = 0;
           if (string.IsNullOrEmpty(searchType))
           {
               sql = sql.Replace("#condition#", "");
           }
           else
           {
               sql = sql.Replace("#condition#", string.Format(" and {0} like'%{1}%'", searchType,key));
           }
           DataTable dt = DbManager.ExcuteDataWithPage(sql, ref totalCount,paras.ToArray());
           List booklist = null;
           if (dt.Rows.Count > 0)
           {
               booklist = ConvertHelper.ConvertToList(dt);
               return new BookPageInfoEntity
               {
                   TotalCount = totalCount,
                   BookList = booklist
               };
           }
           else
           {
               return null;
           }    
       }

  1. 这个比较重要,就列个表说说。
  2. 首先看SQL语句,上半部分是查总数的,这个应该没问题
  3. 下半部分是分页的,利用T-SQL中的ROW_NUMBER()函数来分页,它后面那个OVER ( ORDER BY b.Id)是排序的字段,如果有按什么排序的选择框的话,就可以传个参数进来。
  4. 剩下的就是正常的分页的SQL写法了。
  5. 一共有三个参数,所以定义SqlParameter[]和List都是ok的。
  6. 其中@totalCount是个输出参数,要设置一下它的Direction为ParameterDirection.Output;
  7. 如果有搜索条件传进来要把#condition#替换掉,没有就替换成空字符串
  8. 然后定义个数据表对象,把sql和TotalCount还有参数列表都传入ExcuteDataWithPage中
  9. ok,拿到的是一个装了带有好多BookEntity的和总数的DataTable对象。
  10. 下面是需要把DataTable对象转化成List集合,我调用了一个利用泛型和反射写的转化类,如果不用这个,也可以用for循环或者foreach循环来写,都是OK的。
  11. 转换之后就可以返回给BLL了,给一个BookPageListentity的对象也行,给一个匿名类也可以,不过如果返回一个匿名类的话,就要把函数的类型改成dynamic,怎么做随你了。

就剩下最后一个问题了,ExcuteDataWithPage方法,这个也是我自定义的。不过这个就要跟数据库接触了。先贴代码:

public static DataTable ExcuteDataWithPage(string sql,ref inttotalCount,params SqlParameter[] paras)
       {
           using (SqlConnection con = new SqlConnection(Constr))
           {
               SqlDataAdapter dap = new SqlDataAdapter(sql, con);
               DataTable dt = new DataTable();
               dap.SelectCommand.Parameters.AddRange(paras);
               dap.Fill(dt);
               SqlParameter ttc =dap.SelectCommand.Parameters["@totalCount"];
               if (ttc!=null)
               {
                   totalCount = Convert.ToInt32(ttc.Value);
               }
               return dt;
           }
       }

  1. 首先看参数,有三个,第一个是sql语句,第二个是一个根据业务需要传入的TotalCount,因为int是值类型,所以这里打上ref标记,第三个是SqlParameter[],可变长度的。
  2. 先using一个Sqlconnection对象,然后就可以不用去关闭了,用完了系统会自动给你关闭。
  3. 在using内部定义个SqlDataAdapter dap = new SqlDataAdapter(sql,con),把sql语句和Sqlconnection对象给SqlDataAdapter,这个是数据适配器,这里也可以用SqlCommand对象,看读者喜好了。
  4. 然后把SqlParameter[]赋值给SqlDataAdapter的SelectCommand集合的Parameters集合,用集合通用的方法AddRange或者Add(dap.SelectCommand.Parameters.AddRange(paras);)
  5. 接下来就是很正常的定义个DataTale并且填充到SqlDataAdapter 中了。
  6. 这步也很关键,把@totalCount参数从参数集合中取出来,集合通用的方法,用索引器取。SqlParameter ttc =dap.SelectCommand.Parameters["@totalCount"];
  7. 再把tcc转化成int就大功告成了。

ok,测试一下我们的效果吧!!!是不是感觉很麻烦,不过据说是利于维护,所以就麻烦一次吧,第二次写就不会这么麻烦了。贴图。。。

看那个页脚,唉界面太丑了。凑合看吧,效果大概就这么个效果


                        @Model [i] .Title @Model [i] .Author @Model [i] .Name

编辑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值