MVC下分页的自定义分页一种实现

1、引言

  在MVC开发中我们经常会对数据进行分页的展示。通过分页我们可以从服务端获取指定的数据来进行展示。这样既节约了数据库查询的时间也节约了网络传输的数据量。在MVC开发中使用的比较多的应该是MVCPager控件。这个控件提供无刷新分页等功能。虽然我们有这么好的控件可以使用,但是我们还是需要通过简单的例子来看一下原始的分页技术的雏形,学习下原始分页的技术实现。

2、简单的分页实现

  此处使用T_Products表查询商品数据,然后进行展示。商品类定义如下:

public sealed class Product
    {
        public string ProductId { get; set; }
        public string ProductName { get; set; }
        public string ProductImage { get; set; }
        public int Price { get; set; }
        public string CategoryId { get; set; }
        public string Description { get; set; }
    }

  我们通过仓储模式来定义数据的存储操作。其接口定义和实现类定义

public interface IProductRepository
    {
        /// <summary>
        /// 获取数据库中全部的商品信息
        /// </summary>
        /// <returns></returns>
        IQueryable<T_Product> GetAll(int pageIndex, int pageSize, out int total);
    }
public class ProductRepository : IProductRepository
    {
        private DB_ShoppingEntities shoppingEntities = null;

        public ProductRepository()
        {
            this.shoppingEntities = new DB_ShoppingEntities();
        }

        public IQueryable<T_Product> GetAll(int pageIndex, int pageSize, out int total)
        {
            total = this.shoppingEntities.T_Product.Count();
            return this.shoppingEntities.T_Product.AsQueryable().OrderBy(p => p.Price).Skip((pageIndex - 1) * pageSize).Take(pageSize);
        }
    }

  通过上面的代码我们清晰的看到我们通过Linq表达式来获取指定页数的数据,当然也获取了当前操作所获取的数据的条数。下面我们需要定义自定义分页帮助类来协助我们构造分页所需的一些信息。定义如下:

/// <summary>
    /// 分页帮助类
    /// </summary>
    public sealed class MyPager
    {
        private int total;
        //当前页的索引
        public int pageIndex { get; set; }
        //总的页数
        public int pageCount { get; set; }

        public MyPager(int total, int pageSize, int pageIndex)
        {
            this.total = total;
            this.pageIndex = pageIndex;
            //计算总页数
            int result = this.total % pageSize;
            this.pageCount = result == 0 ? this.total / pageSize : this.total / pageSize + 1;
        }
    }

  我们可以想一想分页的基本流程。我们客户端发送请求到服务端获取指定的数据。这时候我们将符合条件的数据查询出来以后,返回给客户端即可。但是分页的页码也是需要更新的。这里我们可以将分页的一些信息也一起返回给客户端。然客户端在展示新的数据的同时也更新分页的状态。在这里我们可以将分页的信息封装到一个类里面。这样我们可以重新定义一个类模型将需要返回给客户端的Products和分页信息封装到一起一起发给客户端,这样客户端就可以进行渲染。

/// <summary>
    /// 带分页功能的产品类别
    /// </summary>
    public sealed class PagedProducts
    {
        public IList<Product> Products { get; set; }
        public MyPager pager { get; set; }
    }

  这时我们来看控制器中的方法。

public class ProductController : Controller
    {
        private IProductRepository productRepository = null;

        //每一页展示的数量
        private const int pageSize = 4;

        public ProductController(IProductRepository productRepository)
        {
            this.productRepository = productRepository;
        }

        public ViewResult Index(int pageIndex = 1)
        {
            PagedProducts pagedProducts = null;
            IList<Product> list = null;
            int total = 0;
            var products = this.productRepository.GetAll(pageIndex, pageSize, out total);
            if (products != null && products.Count() > 0)
            {
                pagedProducts = new PagedProducts();
                list = new List<Product>();
                foreach (var item in products)
                {
                    list.Add(new Product
                    {
                        ProductId = item.ProductID,
                        ProductName = item.ProductName,
                        ProductImage = item.ProductImage == null ? "" : item.ProductImage,
                        Price = (int)item.Price,
                        CategoryId = item.CategoryID,
                        Description = item.Description
                    });
                }
                //定义分页对象
                pagedProducts.Products = list;
                pagedProducts.pager = new MyPager(total, pageSize, pageIndex);
            }
            return View(pagedProducts);
        }
    }

  我们定义的pagedProducts包含了Products和pager对象。这样我们在客户端就可以进行渲染。客户端的代码如下:

@model Shopping.Models.PagedProducts
@using Shopping.ExtendMethod;
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<style type="text/css">
    table {
        width:60%;
        height:auto;
        margin:60px auto;
        border-collapse:collapse;
        border:0px;
        min-width:600px;
        min-height:360px;
    }
    table tr{
        text-align:center;
        height:30px;
        line-height:30px;
    }
    /*设置第一行的样式*/
    table tr:first-child {
        background-color:#cccccc;
        font-weight:bold;
    }

    table tr td {
        border:1px #565252 solid;
    }
    div {
        width:60%;
        height:30px;
        margin:20px auto;
    }
    div a {
        line-height:30px;
        text-align:center;
        padding:12px;
        font-size:14px;
        text-decoration:none;
    }
    div .selected {
        font-weight:bold;
        font-size:16px;
    }
</style>
<table>
    @if (Model != null && Model.Products.Count > 0)
    {
        <tr>
            <td>编号</td>
            <td>名称</td>
            <td>价格</td>
        </tr>
        foreach (var item in Model.Products)
        {
            <tr>
                <td>@item.ProductId</td>
                <td>@item.ProductName</td>
                <td>@item.Price</td>
            </tr>
        }
    }
    else
    {
        <tr>
            <td>
                当前不存在数据
            </td>
        </tr>
    }
</table>
<!--分页-->
<div>
    @Html.MyPagerLink(Model.pager, index => Url.Action("Index", new { pageIndex = index }))
</div>

  我们看到MyPagerLink方法,这个方法就是我们自定义进行分页的渲染方法。通过服务端传递的分页信息来渲染指定的分页信息进行展示。其代码如下:

/// <summary>
    /// 定义扩展方法
    /// </summary>
    public static class ExtendMethod
    {
        /// <summary>
        /// 自定义分页扩展方法
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="pager">分页对象</param>
        /// <param name="pageUrl">定义委托,该委托满足给定int类型的参数返回string类型的返回结果</param>
        /// <returns></returns>
        public static MvcHtmlString MyPagerLink(this HtmlHelper htmlHelper, MyPager pager, Func<int, string> pageUrl)
        {
            StringBuilder result = null;
            if (pager.pageCount > 0)
            {
                result = new StringBuilder();
                for (int i = 1; i <= pager.pageCount; i++)
                {
                    TagBuilder tag = new TagBuilder("a");
                    //指定页数的链接
                    tag.MergeAttribute("href", pageUrl(i));
                    tag.InnerHtml = i.ToString();
                    if (i == pager.pageIndex)
                    {
                        tag.AddCssClass("selected");
                    }
                    result.Append(tag.ToString());
                }
            }
            return MvcHtmlString.Create(result == null ? "" : result.ToString());
        }
    }

  我们通过看代码可以发现改代码通过获取分页的总页数来动态的创建<a>标签。我们来看一下最后的效果:

时间: 2024-11-08 14:29:37

MVC下分页的自定义分页一种实现的相关文章

python/Djangof分页与自定义分页

python/Djangof分页与自定义分页 Django分页 1 ##============================================分页======================================================= 2 # current_pagc = request.GET.get('page') 3 # from django.core.paginator import Paginator,Page 4 # # result = m

thinkphp 分页-自定义分页样式

0x01 tp分页类  /think/library/Think/Page.class.php 调用page类 $p = intval(I('get.p'));  //获取分页请求 $condition['xx'] =$xx; //设置查询条件 $m = M('xx'); $count = count($m->select()); //计算符合条件的数据总量 $page = new \Think\Page($count,10) //10条数据一页 $data = $m ->where($con

Python之路65-Django分页、自定义分页

目录 一.XSS 二.分页1 三.分页2 四.分页3 一.XSS 有下面一段代码,想将这段代码中的字符串渲染到HTML页面中,默认Django是不能这样去操作的 views.py def user_list(request):     page_str = """         <a href="/user_list/?p=1">1</a>         <a href="/user_list/?p=2"

Mvc自定义分页控件

MVC开发分页常常使用第三方控件,生成的分页HTML带有版权申明,虽然免费,但是总有的别扭.于是,某日,楼主闲来蛋疼,折腾了个自定义分页控件: 先来展示下效果图: 1>当分页不超过10页的时候,完全显示出来: 2>当分页超过10页,效果图如下所示: 再来看看生成的分页代码,竟然和楼主一样纯洁!!! 3>支持自定义路由.参数.页码html格式.首末页是否显示.上下页是否显示.URL分页参数传递功能. 使用方法: 1.引用 YYP.PagerHtml.dll 2.页面使用 @using YY

MVC项目实践,在三层架构下实现SportsStore-04,实现分页

SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管理.图像上传......是不错的MVC实践项目,但该项目不是放在多层框架下开发的,离真实项目还有一段距离.本系列将尝试在多层框架下实现SportsStore项目,并用自己的方式实现一些功能. 本篇为系列第四篇,包括: ■ 7.添加分页 7.添加分页 关于分页,是一系列的a标签,可以通过扩展HtmlHelper

GridView自定义分页样式(上一页,下一页,到第几页)

今天要为网站做一个文章列表,发现GridView的分页样式很难看,于是结合网上的例子,自己做了一个.不是很美观,不过还是很实用的,先看下效果吧,如图(1). 图(1)GridView分页效果 自定义GridView的分页样式,使用的是GridView的  <PagerTemplate>元素.我们先看这段分页代码. 1 <PagerTemplate> 2 <br /> 3 <asp:Label ID="lblPage" runat="s

laravel5自定义分页

laravel5分页处理与laravel4略有区别,laravel5提供了更方便的处理方式,可以方便满足不同分页展示. laravel4自定义分页:http://php2012web.blog.51cto.com/5585213/1539601 laravel分页处理有分两个入口,即两个处理对象: DB操作分页       Illuminate\Database\Query\Builder ORM操作分页   Illuminate\Database\Eloquent\Builder DB操作分页

EF 之 MVC 排序,查询,分页 Sorting, Filtering, and Paging For MVC About EF

最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    上篇博客我们学习了EF CodeFirst增删改查之'CRUD',今儿,我们来探讨下MVC下的EF 排序.查询.分页操作 在此,本人先从分页说起 话说,做过webForm项目的程序员用AspNetPage.DLL做过分页,做过EasyUI框架的程序员,用JS AJAX请求分页,那么,MVC 程序员用什么进行分页呢? 当然,MVC程序亦可以使用上述方

Python之路【第十九篇】自定义分页实现(模块化)

自定义分页 1.目的&环境准备 目的把分页写成一个模块的方式然后在需要分页的地方直接调用模块就行了. 环境准备Django中生成一个APP并且注册,配置URL&Views 配置URL from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^user_lis