我之前就已经实现了ASP.NET MVC分页(查看该博文),但它有局限性,必须确保在同一个视图中只能有一处分页,若需要在同一个视图中设置多个分页,却无能为力,为此,我重新对原先的代码进行了优化,增加了更为灵活的配置属性及生成规则,解决了上述问题,代码如下:

一、PageInfo类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
 
namespace ROIS.Models
{
    /// <summary>
    /// 分页信息
    /// </summary>
    public class PageInfo
    {
        private int _RecordCount = 0;
        private int _PageSize = 10;
        private int _CurrentPageNo = 1;
        private string _PageNoCtrlName = "_pageno";
        private bool _CreateScript = true;
        /// <summary>
        /// 获取或设置记录总数
        /// </summary>
        public int RecordCount
        {
            get
            {
                return _RecordCount;
            }
            set
            {
                if (value > 0)
                {
                    _RecordCount = value;
                }
            }
        }
 
        /// <summary>
        /// 获取或设置每页记录数
        /// </summary>
        public int PageSize
        {
            get
            {
                return _PageSize;
            }
            set
            {
                if (value > 0)
                {
                    _PageSize = value;
                }
            }
        }
 
        /// <summary>
        /// 获取或设置当前索引页码(从1开始计算)
        /// </summary>
        public int CurrentPageNo
        {
            get
            {
                return _CurrentPageNo;
            }
 
            set
            {
                if (value > 0)
                {
                    if (value > this.PageCount)
                    {
                        _CurrentPageNo = this.PageCount;
                    }
                    else
                    {
                        _CurrentPageNo = value;
                    }
                }
            }
        }
 
        /// <summary>
        /// 获取总页数
        /// </summary>
        public int PageCount
        {
            get
            {
                if (this.RecordCount <= 0)
                {
                    return 1;
                }
 
                return this.RecordCount / this.PageSize + (this.RecordCount % this.PageSize > 0 ? 1 : 0);
            }
        }
 
 
        /// <summary>
        /// 获取或设置保存页码的控件名称
        /// </summary>
        public string PageNoCtrlName
        {
            get
            {
                return _PageNoCtrlName;
            }
            set
            {
                if (!string.IsNullOrEmpty(value))
                {
                    _PageNoCtrlName = value;
                }
            }
        }
 
        /// <summary>
        /// 是否需要创建脚本函数
        /// </summary>
        public bool CreateScript
        {
            get { return _CreateScript; }
            set { _CreateScript = value; }
        }
 
        public PageInfo()
        { }
 
        public PageInfo(int recordCount, int currentPageNo, int pageSize = 10, string pageNoCtrlName = null, bool createScript = true)
        {
            this.RecordCount = recordCount;
            this.PageSize = pageSize;
            this.CurrentPageNo = currentPageNo;
            this.PageNoCtrlName = pageNoCtrlName;
            this.CreateScript = createScript;
        }
 
 
        /// <summary>
        /// 是否为首页
        /// </summary>
        /// <returns></returns>
        public bool IsFirstPage()
        {
            return (this.CurrentPageNo <= 1);
        }
 
 
        /// <summary>
        /// 是否为末页
        /// </summary>
        /// <returns></returns>
        public bool IsLastPage()
        {
            return (this.CurrentPageNo >= this.PageCount);
        }
 
    }
}

二、_Pager局部视图(建议放在Shared目录下)

@using ROIS.Models;
@model PageInfo
 
@if (Model!=null && Model.RecordCount > 0)
{           
<div class="pager">
    第@(Model.CurrentPageNo) 页&nbsp;/&nbsp;共@(@Model.PageCount)页,
@if (Model.IsFirstPage())
{
    <span>|&lt;首&nbsp;&nbsp;页</span>
    <span>&lt;上一页</span>
}
else
{
    <a href="javascript:turnPage(1,"@Model.PageNoCtrlName");">|&lt;首&nbsp;&nbsp;页</a>
    <a href="javascript:turnPage(@(Model.CurrentPageNo-1),"@Model.PageNoCtrlName");">&lt;上一页</a>
}
@if (Model.IsLastPage())
{
    <span>下一页&gt;</span>
    <span>末&nbsp;&nbsp;页&gt;|</span>
}
else
{
     <a href="javascript:turnPage(@(Model.CurrentPageNo+1),"@Model.PageNoCtrlName");">下一页&gt;</a>
     <a href="javascript:turnPage(@Model.PageCount,"@Model.PageNoCtrlName");">末&nbsp;&nbsp;页&gt;|</a>
}
转到:
<select id="pages" onchange="javascript:turnPage(this.value,"@Model.PageNoCtrlName");">
    @for (int i = 1; i <= Model.PageCount; i++)
    {
        if (Model.CurrentPageNo == i)
        {
        <option value="@i" selected="selected">第@(i)页</option>
        }
        else
        {
        <option value="@i">第@(i)页</option>
        }
    }
</select>
<input type="hidden" id="@Model.PageNoCtrlName" name="@Model.PageNoCtrlName" />
</div>
if(Model.CreateScript)
{
<script type="text/javascript">
<!--
    function turnPage(pageNo,ctrlId) {
 
        var oPageNo = document.getElementById(ctrlId);
        oPageNo.value = pageNo;
        oPageNo.form.submit();
    }
 
    function getForm(obj) {
        if (obj.parentNode.nodeName.toLowerCase() == "form") {
            return obj.parentNode;
        } else {
            getForm(obj.parentNode);
        }
    }
//-->
</script>
}
 
}

三、使用方法:后台Controller的Action中加入:

string pageNo = Request.Form["_pageno"];
                int iPageNo = 1;
                int.TryParse(pageNo, out iPageNo);
                PageInfo pageInfo = new PageInfo(detailList.Count(), iPageNo, 30, "_pageno", false);
ViewBag.PageInfo = pageInfo;
 
pageNo = Request.Form["_pageno2"];
                iPageNo = 1;
                int.TryParse(pageNo, out iPageNo);
                PageInfo pageInfo2 = new PageInfo(detailList2.Count(), iPageNo, 30, "_pageno2",true);
ViewBag.PageInfo2 = pageInfo2;

前台VIEW页面代码如下:(注: ROIS是我专案名称,依实际情况更换)

@Html.Partial("_Pager", ViewBag.PageInfo as ROIS.Models.PageInfo)

 
@Html.Partial("_Pager", ViewBag.PageInfo2 as ROIS.Models.PageInfo)
 
 

文章同步发表于我的个人网站:http://www.zuowenjun.cn/post/2014/10/23/65.html

ASP.NET MVC分页实现之改进版-增加同一个视图可设置多个分页的更多相关文章

  1. ASP.NET MVC中将数据从Controller传递到视图

    ASP.NET MVC中将数据从Controller传递到视图方法 1.ViewData ViewData的类型是字典数据,key-value 如:ViewData["Data"] ...

  2. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

  3. ASP.NET MVC之从控制器传递数据到视图四种方式(一)

    前言 本系列开始着手讲述ASP.NET MVC,也算是自己对基础的回顾以及进一步深入学习,保证每天发表一篇该系列文章,关于基本知识则不再叙述,园子有关文章不胜枚举,这一系列若有叙述不当或错误之处,欢迎 ...

  4. ASP.NET MVC之从控制器传递数据到视图四种方式

    前言 本系列开始着手讲述ASP.NET MVC,也算是自己对基础的回顾以及进一步深入学习,保证每天发表一篇该系列文章,关于基本知识则不再叙述,园子有关文章不胜枚举,这一系列若有叙述不当或错误之处,欢迎 ...

  5. asp.net mvc 3 配置全局错误处理 Web.config中设置CustomError

    摘自: http://www.myexception.cn/web/1130191.html asp.net mvc 配置全局异常处理 Web.config中设置CustomError Web.con ...

  6. ASP.NET WEBAPI 简单CURD综合测试(asp.net MVC,json.net,sql基础存储过程和视图,sqlhelper,json解析)

    草图   真正的后端是不管前端是什么平台,用什么语言的,JSON格式的数据应该可以应对.用ASP.NET WEBAPI尝试做一个后端,实现最基本的CURD,业务逻辑和数据库操作都放在后端,前端只需要正 ...

  7. ASP.NET MVC之从控制器传递数据到视图方式

    为了演示,先定义一个类 新建基本项目在Models文件夹下定义如下类: public class Person { public int Id { get; set; } public string ...

  8. ASP.NET MVC 5 02 - ASP.NET MVC 1-5 各版本特点

    参考书籍:<ASP.NET MVC 4 高级编程>.<ASP.NET MVC 5 高级编程>.<C#高级编程(第8版)>.<使用ASP.NET MVC开发企业 ...

  9. 7 天玩转 ASP.NET MVC — 第 1 天

    0. 前言正如标题「7 天玩儿转 ASP.NET MVC」所言,这是个系列文章,所以将会向大家陆续推出 7 篇.设想一下,一天一篇,你将从一个愉快的周一开始阅读,然后在周末成为一个 ASP.NET M ...

随机推荐

  1. mybatis 3.2.3 maven dependency pom.xml 配置

    <dependency>      <groupId>org.mybatis</groupId>      <artifactId>mybatis< ...

  2. Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  3. Codeforces Round #177 (Div. 1) 题解【ABCD】

    Codeforces Round #177 (Div. 1) A. Polo the Penguin and Strings 题意 让你构造一个长度为n的串,且里面恰好包含k个不同字符,让你构造的字符 ...

  4. 有时候为了方便sql语句的对比和查询,我们可以使用declare来定义变量 上下篇的问题

    --定义一些参数 declare @nodeId int,@ekid int ,@ecid int,@eid int,@pid int --列表 SELECT * FROM ( SELECT *,RO ...

  5. WPF下载远程文件,并显示进度条和百分比

    WPF下载远程文件,并显示进度条和百分比 1.xaml <ProgressBar HorizontalAlignment="Left" Height="10&quo ...

  6. 转:ecshop商品分类页获取相册列表方法

    ecshop商品分类页获取相册列表方法 很久之前就看到过你好在商品列表页有获取到相册列表,但是一直没有实践过,感觉应该挺简单的吧,但是最近手上的项目刚好就需要这个功能,然后就想到网上查下资料,至少找个 ...

  7. Strategy策略设计模式

    1.策略模式和状态模式的区别和联系(本部分转载自:http://letscoding.cn/java%E4%B8%AD%EF%BC%8C%E7%8A%B6%E6%80%81%E6%A8%A1%E5%B ...

  8. 彻底解决Android SDK Manager更新慢的问题

    Android SDK 下载速度慢,解决方法大概有两种.第一,FQ.这种方法比较彻底,但是要想有稳定的效果还的要花大价钱.第二,有些高人直接给了SDK中各软件的下载地址,直接下载速度非常快,下载后将包 ...

  9. 解决CSS移动端1px边框问题

    移动项目开发中,安卓或者IOS等高分辨率屏幕会把1px的border渲染成2px来显示,网上搜了一下,解决方法如下: 一.利用css中的transform的缩放属性解决,推荐这个.如下面代码. < ...

  10. 使用过滤器解决SQL注入和跨站点脚本编制

    1 SQL注入.盲注 1.1 SQL注入.盲注概述 Web 应用程序通常在后端使用数据库,以与企业数据仓库交互.查询数据库事实上的标准语言是 SQL(各大数据库供应商都有自己的不同版本).Web 应用 ...