视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
asp.net 通用分页显示辅助类(改进版)
2020-11-27 22:43:19 责编:小采
文档

闲暇时重新再看之前很多项目代码的时候,发现很多总是有那么点缺陷的代码,如芒刺入骨,令人心烦。挣扎良久,苦口婆心劝荐自己今后要争取把某些代码写的更易用更灵活更完善一些。比如在这篇已经提及到的通用客户端分页显示辅助类(AspNetPager),在大大小小项目中出现频率非常高,但是显然对分页形式的选择和样式的控制弱了点。虽然之前这个功能的实现都是按照实际项目的需求来实现的,对旧项目没有影响,但是这也不能成为该功能没有充分实现扩展性和通用性的理由,这点向来自傲的楼猪也不得不承认。

1、分页模式和样式扩展
(1)定义枚举
代码如下:


/// <summary>
/// 表格对齐枚举
/// </summary>
public enum TbAlignEnum
{
Left = 1,

Center = 2,

Right = 3
}

/// <summary>
/// 分页模式
/// </summary>
public enum PagerModoule
{
/// <summary>
/// 普通分页模式
/// </summary>
Normal = 1,

/// <summary>
/// 统计分页模式
/// </summary>
Statistics = 2
}

(2)根据枚举呈现
代码如下:


/// <summary>
/// 分页实用类
/// </summary>
public sealed class AspNetPager
{
#region common

private const string defaultAlign = "center";//默认对齐方式
private const string leftAlign = "left";
private const string rightAlign = "right";

/// <summary>
/// 获取页数
/// </summary>
/// <param name="objs">总记录数</param>
/// <param name="recordCountPerPage">每页记录数</param>
/// <returns></returns>
public static int GetPageCout(object[] objs, int recordCountPerPage)
{
return (int)Math.Ceiling(((double)objs.Length / (double)recordCountPerPage));
}

/// <summary>
/// 获取页数
/// </summary>
/// <param name="totalCount">总记录数</param>
/// <param name="recordCountPerPage">每页记录数</param>
/// <returns></returns>
public static int GetPageCout(int totalCount, int recordCountPerPage)
{
int result = 0;
if (totalCount % recordCountPerPage == 0)
{
result = totalCount / recordCountPerPage;
}
else
{
result = totalCount / recordCountPerPage + 1;
}
return result;
}

#endregion

#region render pager

/// <summary>
/// 写分页页码(没有表格)
/// </summary>
/// <param name="pagerMode"></param>
/// <param name="response"></param>
/// <param name="baseString"></param>
/// <param name="totalCount">总记录数</param>
/// <param name="nowPage">当前页数</param>
/// <param name="recordCountPerPage">每页记录数</param>
public static void RenderPager(PagerModoule pagerMode, HttpResponse response, int totalCount, int nowPage, int recordCountPerPage, string baseString)
{
int pageCount = GetPageCout(totalCount, recordCountPerPage);
string pagerString = string.Empty;
if (pageCount > 0)
{
switch (pagerMode)
{
case PagerModoule.Normal:
pagerString = CreateLinkUrl(baseString, pageCount, nowPage, recordCountPerPage);
break;
case PagerModoule.Statistics:
pagerString = CreateStatisticLinkUrl(baseString, totalCount, pageCount, nowPage, recordCountPerPage);
break;
default:
pagerString = CreateLinkUrl(baseString, pageCount, nowPage, recordCountPerPage);
break;
}
response.Write(pagerString);
}
}

/// <summary>
/// 写分页页码(有表格)
/// </summary>
/// <param name="pagerMode"></param>
/// <param name="alignEnum"></param>
/// <param name="response"></param>
/// <param name="baseString"></param>
/// <param name="totalCount">总记录数</param>
/// <param name="nowPage">当前页数</param>
/// <param name="recordCountPerPage">每页记录数</param>
public static void RenderTablePager(PagerModoule pagerMode, TbAlignEnum alignEnum, HttpResponse response, int totalCount, int nowPage, int recordCountPerPage, string baseString)
{
int pageCount = GetPageCout(totalCount, recordCountPerPage);
if (pageCount > 0)
{
string align = string.Empty;
switch (alignEnum)
{
case TbAlignEnum.Left:
align = leftAlign;
break;
case TbAlignEnum.Center:
align = defaultAlign;
break;
case TbAlignEnum.Right:
align = rightAlign;
break;
default:
align = defaultAlign;
break;
}
StringBuilder sbTable = new StringBuilder();
sbTable.AppendFormat("<table><tr align='{0}'><td>", align);
string pagerString = string.Empty;
switch (pagerMode)
{
case PagerModoule.Normal:
pagerString = CreateLinkUrl(baseString, pageCount, nowPage, recordCountPerPage);
break;
case PagerModoule.Statistics:
pagerString = CreateStatisticLinkUrl(baseString, totalCount, pageCount, nowPage, recordCountPerPage);
break;
default:
pagerString = CreateLinkUrl(baseString, pageCount, nowPage, recordCountPerPage);
break;
}
sbTable.Append(pagerString);
sbTable.Append("</td></tr></table>");
response.Write(sbTable.ToString());
}
}

#endregion

#region create link

/// <summary>
/// 生成分页字符串(显示页数和每页记录数相关)
/// </summary>
/// <param name="baseString"></param>
/// <param name="pageCount">页数</param>
/// <param name="nowPage">当前页数</param>
/// <param name="recordCountPerPage">每页记录数(推荐记录数:10)</param>
/// <returns></returns>
private static string CreateLinkUrl(string baseString, int pageCount, int nowPage, int recordCountPerPage)
{
StringBuilder sb = new StringBuilder();
int from, to;
if (nowPage - recordCountPerPage > 0)
{
from = nowPage - recordCountPerPage;
}
else
from = 1;
if (pageCount == 0)
pageCount = 1;
if (pageCount - nowPage - recordCountPerPage > 0)
{
to = nowPage + recordCountPerPage;
}
else
to = pageCount;

if (baseString.IndexOf("?") == -1)
baseString += "?";
else
baseString += "&";
sb.Append(string.Format("<a href=\"{0}pageIndex=1\" >首页</a>", baseString));
if (pageCount > 1 && nowPage > 1)
{
sb.AppendFormat("<a href=\"{0}pageIndex={1}\" >上一页</a>", baseString, (nowPage - 1).ToString());
}
else
{
sb.Append("<a href='javascript:void(0);' style='color:gray;' >上一页</a>");
}
for (int i = from; i <= to; i++)
{
if (i == nowPage)
{
sb.AppendFormat(" <a href='javascript:void(0);' style='color:red;' >{0}</a>", nowPage.ToString());
}
else
{
sb.AppendFormat(" <a href=\"{0}pageIndex={1}\" >{1}</a>", baseString, i);
}
}
if (pageCount > 1 && nowPage < pageCount)
{
sb.AppendFormat("<a href=\"{0}pageIndex={1}\" >下一页</a>", baseString, (nowPage + 1).ToString());
}
else
{
sb.Append("<a href=\"javascript:void(0);\" style='color:gray;' >下一页</a>");
}
sb.Append(string.Format(" <a href={0}pageIndex={1} >尾页</a>", baseString, pageCount));
return sb.ToString();
}

/// <summary>
/// 生成含统计信息的分页字符串(显示页数和每页记录数相关)
/// </summary>
/// <param name="baseString"></param>
/// <param name="totalCount">总记录数</param>
/// <param name="pageCount">页数</param>
/// <param name="nowPage">当前页数</param>
/// <param name="recordCountPerPage">每页记录数(推荐记录数:10)</param>
/// <returns></returns>
private static string CreateStatisticLinkUrl(string baseString, int totalCount, int pageCount, int nowPage, int recordCountPerPage)
{
StringBuilder sb = new StringBuilder();
string numricPager = CreateLinkUrl(baseString, pageCount, nowPage, recordCountPerPage);//普通数字分页
sb.AppendFormat("总共<span style='color:red;'>{0}</span>条记录,共<span style='color:red;'>{1}</span>页,当前第<span style='color:red;'>{2}</span>页  ",
totalCount, pageCount, nowPage);
sb.Append(numricPager);
return sb.ToString();
}

#endregion
}

ps1:除了表格内容对齐方式外,代码里对样式的控制几乎都是硬编码,个人认为编码阶段对样式的控制越少越好。理想状态下,样式应该让UI全部在外部控制,而不应该由程序员来设计实现,这里结合实际情况取折中方案。
ps2:分页显示的方式其实还可以扩展,具体请参考gridview控件分页模式。
2、页面内调用
代码如下:


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Pager.aspx.cs" Inherits="WebTest.Pager" %>

<%@ Import Namespace=" DotNet.Common.WebForm" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>aspnet简单分页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%DotNet.Common.WebForm.AspNetPager.RenderTablePager(PagerModoule.Normal, TbAlignEnum.Right, Response, 93, 10, 10, "Pager.aspx"); %>
</div>
</form>
</body>
</html>

3、有图有
(1)、普通模式


(2)、带统计模式

最后,欢迎补充,期待您的建议和意见。

演示文件打包下载

下载本文
显示全文
专题