我之前就已经实现了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) 页 / 共@(@Model.PageCount)页,
@if (Model.IsFirstPage())
{
<span>|<首 页</span>
<span><上一页</span>
}
else
{
<a href="javascript:turnPage(1,"@Model.PageNoCtrlName");">|<首 页</a>
<a href="javascript:turnPage(@(Model.CurrentPageNo-1),"@Model.PageNoCtrlName");"><上一页</a>
}
@if (Model.IsLastPage())
{
<span>下一页></span>
<span>末 页>|</span>
}
else
{
<a href="javascript:turnPage(@(Model.CurrentPageNo+1),"@Model.PageNoCtrlName");">下一页></a>
<a href="javascript:turnPage(@Model.PageCount,"@Model.PageNoCtrlName");">末 页>|</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中将数据从Controller传递到视图
ASP.NET MVC中将数据从Controller传递到视图方法 1.ViewData ViewData的类型是字典数据,key-value 如:ViewData["Data"] ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- ASP.NET MVC之从控制器传递数据到视图四种方式(一)
前言 本系列开始着手讲述ASP.NET MVC,也算是自己对基础的回顾以及进一步深入学习,保证每天发表一篇该系列文章,关于基本知识则不再叙述,园子有关文章不胜枚举,这一系列若有叙述不当或错误之处,欢迎 ...
- ASP.NET MVC之从控制器传递数据到视图四种方式
前言 本系列开始着手讲述ASP.NET MVC,也算是自己对基础的回顾以及进一步深入学习,保证每天发表一篇该系列文章,关于基本知识则不再叙述,园子有关文章不胜枚举,这一系列若有叙述不当或错误之处,欢迎 ...
- asp.net mvc 3 配置全局错误处理 Web.config中设置CustomError
摘自: http://www.myexception.cn/web/1130191.html asp.net mvc 配置全局异常处理 Web.config中设置CustomError Web.con ...
- ASP.NET WEBAPI 简单CURD综合测试(asp.net MVC,json.net,sql基础存储过程和视图,sqlhelper,json解析)
草图 真正的后端是不管前端是什么平台,用什么语言的,JSON格式的数据应该可以应对.用ASP.NET WEBAPI尝试做一个后端,实现最基本的CURD,业务逻辑和数据库操作都放在后端,前端只需要正 ...
- ASP.NET MVC之从控制器传递数据到视图方式
为了演示,先定义一个类 新建基本项目在Models文件夹下定义如下类: public class Person { public int Id { get; set; } public string ...
- ASP.NET MVC 5 02 - ASP.NET MVC 1-5 各版本特点
参考书籍:<ASP.NET MVC 4 高级编程>.<ASP.NET MVC 5 高级编程>.<C#高级编程(第8版)>.<使用ASP.NET MVC开发企业 ...
- 7 天玩转 ASP.NET MVC — 第 1 天
0. 前言正如标题「7 天玩儿转 ASP.NET MVC」所言,这是个系列文章,所以将会向大家陆续推出 7 篇.设想一下,一天一篇,你将从一个愉快的周一开始阅读,然后在周末成为一个 ASP.NET M ...
随机推荐
- 努力学习 HTML5 (1)—— 初体验
HTML5 代表未来:W3C ( World Wide Web Consortium, 万维网联盟) 已经放弃 XHTML,从而使 HTML5 成为正式标准并得到认可. 最简单的 HTML5 文档 & ...
- 【转】兼容iOS 10 资料整理
1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到UserN ...
- Scala 深入浅出实战经典 第77讲:模式匹配下的提取器动手构造实战
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- 网页内容导出word/excel的js代码
IE设置: 工具-> Internet选项-> 安全->自定义级别-> 对没有标记安全级别的ActiveX控件进行初始化 设为启用! 1.导出word //指定区域导出到Wo ...
- ISO/IEC 9899 C语言标准(非官方翻译)
本系列博文将以ISO/IEC 9899最新的官方手册为准,然后再添加GCC以及Clang编译器对标准的扩展. 本系列博文将不仅仅是针对C编程语言(C Programming Language)标准的翻 ...
- “合规性”是考核IT运维的重要指标
ITSM的绩效考核向来是一个令人头疼的问题,有时就像一团乱麻,既无章可循,又无从下手.其实,只要掌握正确的思想方法,就能拨云见日.“斩乱麻”需“快刀”,“合规性考核”就是斩ITSM绩效考核这团乱麻的快 ...
- dubbo 2.5.4-SNAPSHOT dubbo-admin 报错
问题描述: RROR context.ContextLoader - Context initialization failed org.springframework.beans.factory.B ...
- [原创]android自定义动画的一点感悟
android提供了一系列的动画处理api,包括animator以及animation等.由于动画效果是根据人眼视觉残留原理形成的,因此动画过程中android需要不断频繁的更新view的相关属性,由 ...
- shell编程总结
一.学习 shell脚本之前的基础知识 [linux shell中的特殊符号] 1. * :代表零个或多个字符或数字. test后面可以没有任何字符,也可以有多个字符,总之有或没有都能匹配出来. 2. ...
- 为Eclipse添加Java和Android SDK源代码
1.添加jdk源码进入eclipse Ctrl + Click -->Attached Source 路径:D:\Program Files\Java\jdk1.8.0_45\src.zip 2 ...