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

我之前就已经实现了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

时间: 2024-08-03 14:48:15

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

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

前言 本系列开始着手讲述ASP.NET MVC,也算是自己对基础的回顾以及进一步深入学习,保证每天发表一篇该系列文章,关于基本知识则不再叙述,园子有关文章不胜枚举,这一系列若有叙述不当或错误之处,欢迎指出以及批评. 前奏 新建基本项目在Models文件夹下定义如下类: public class Person { public int Id { get; set; } public string Name { get; set; } public string BlogAddress { get;

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

前言 本系列开始着手讲述ASP.NET MVC,也算是自己对基础的回顾以及进一步深入学习,保证每天发表一篇该系列文章,关于基本知识则不再叙述,园子有关文章不胜枚举,这一系列若有叙述不当或错误之处,欢迎指出以及批评. 前奏 新建基本项目在Models文件夹下定义如下类: public class Person { public int Id { get; set; } public string Name { get; set; } public string BlogAddress { get;

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

草图 真正的后端是不管前端是什么平台,用什么语言的,JSON格式的数据应该可以应对.用ASP.NET WEBAPI尝试做一个后端,实现最基本的CURD,业务逻辑和数据库操作都放在后端,前端只需要正确访问和提供必要的数据就行. 个人习惯 我喜欢先意淫一下需求,然后找出需要的实体和逻辑,而不是先设计数据库,现在EF那么牛逼,完全可以在代码上生成表和表之间的关系,各种查询语句效率并不一定比你写sql语句差.所以我在做东西的时候从来不先考虑数据的.但是今天主要是练习api和复习一下ado.net的CUR

ASP.NET MVC 排球计分程序 (七)视图代码和一些解释

Index 视图 @{ ViewBag.Title = "Index"; } <html> <head> <title>输入姓名</title> </head> <body> @using(Html.BeginForm("AddPerson","Home")) { <table border="1"> <tr> <th>

[转][译]ASP.NET MVC 4 移动特性

此教程将讨论ASP.NET MVC 4 Web应用程序里的移动特性.对于此教程,可以使用 Visual Studio Express 2012 或者 Visual Web Developer 2010 Express Service Pack 1 ("Visual Web Developer 或者 VWD").  如果你已经有了专业版本的 Visual Studio 你也可以使用. 开始之前,确保你已经安装了以下列出的必需项. Visual Studio Express 2012 (推

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

0. 前言正如标题「7 天玩儿转 ASP.NET MVC」所言,这是个系列文章,所以将会向大家陆续推出 7 篇.设想一下,一天一篇,你将从一个愉快的周一开始阅读,然后在周末成为一个 ASP.NET MVC 开发者,这很酷吧! 7 天玩儿 转 ASP.NET MVC — 第 1 天 第一天是热身运动,这篇我们将围绕 Controller 和 Views 实践两个 Labs.在每个 Lab 之中都伴随着一些 Question 和 Answer.所以文章的主体框架是 Lab 和 Q&A. 7 天玩儿

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

前言 正如标题「7天玩儿转 ASP.NET MVC」所言,这是个系列文章,所以将会向大家陆续推出 7 篇.设想一下,一天一篇,你将从一个愉快的周一开始阅读,然后在周末成为一个 ASP.NET MVC 开发者.这很酷吧. 第一天是热身运动,这篇我们将围绕 Controller 和 Views 实践两个 Labs.在每个 Lab 之中都伴随着一些 Question 和 Answer.所以文章的主体框架是 Lab 和 Q&A. 开始之前的准备 我们只需要 Visual Studio 工具就可以开始 A

ASP.NET MVC 企业级实战

1.泛型 public class List<T>{ } 当定义泛型类的实例时,必须指定这个实例所存储的实际类型,泛型允许程序员将一个实际的数据类型规约延迟至泛型的实例被创建时才确定,泛型主要有两个有点: 1)编译时可以保证类型安全 2)不用做类型装换,获得一定的性能提升. 2.泛型方法.泛型委托.泛型接口 //泛型委托 public delegate void Del<T>(T item); public static void Notify(int i){} //泛型接口 pu

ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点

在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity Framework的背景信息,然后再详细学习如何搭建开发环境. 1.1 MVC和ASP.NET MVC 这本书涵盖Microsoft版本的MVC,即ASP.NET MVC.在写本书的时候,ASP.NET MVC的生产版本为MVC5,因此,本书的示例代码都使用ASP.NET MVC 5编写.在本书中