在开发Web网站中,经常会用到分页的操作.记录下自己怎么使用PageHelper类实现分页控件的
MVC一样的用法
效果展示图
创建PageHelper辅助类
public class PageHelper
{
/// <summary>
/// 上一页文本
/// </summary>
public string PrevText { set; get; }
/// <summary>
/// 下一页文本
/// </summary>
public string NextText { set; get; }
/// <summary>
/// 首页文本
/// </summary>
public string FirstText { set; get; }
/// <summary>
/// 尾页文本
/// </summary>
public string EndText { set; get; }
private int _maxPage;
/// <summary>
/// 最大页码
/// </summary>
public int MaxPage
{
get
{
if (_maxPage == 0)
{
_maxPage = (int)Math.Ceiling((decimal)TotalCounts / PageSize);
}
return _maxPage;
}
}
/// <summary>
/// url生成规则
/// </summary>
public Func<int, string> UrlGenerate { set; get; }
/// <summary>
/// 总数据数量
/// </summary>
public int TotalCounts { set; get; }
/// <summary>
/// 单页数据量
/// </summary>
public int PageSize { set; get; }
private string OnUrlGenerate(int index)
{
if (UrlGenerate != null)
{
return UrlGenerate(index);
}
else
{
return string.Empty;
}
}
public PageHelper(int totalCounts, int pageSize, string prevText, string nextText, Func<int, string> func = null)
{
TotalCounts = totalCounts;
PageSize = pageSize;
PrevText = prevText;
NextText = nextText;
UrlGenerate = func;
}
public PageHelper(int totalCounts, int pageSize, Func<int, string> func = null)
{
TotalCounts = totalCounts;
PageSize = pageSize;
UrlGenerate = func;
}
/// <summary>
/// 获取分页Html
/// </summary>
/// <param name="currentIndex">传入当前页</param>
/// <returns></returns>
public string GetString(int currentIndex)
{
//边界条件判断和处理
if (MaxPage == 1) return "";
if (currentIndex > MaxPage) currentIndex = MaxPage;
if (currentIndex < 1) currentIndex = 1;
//分页结果显示数量
int showCount = 9;
//右边显示最大页码
int rightMax = currentIndex + showCount / 2;
//左边显示最大页码
int leftMin = currentIndex - showCount / 2;
GetLimit(ref rightMax, ref leftMin);
//统一的页码范围判定
if (leftMin <= 0) leftMin = 1;
if (rightMax > MaxPage) rightMax = MaxPage;
//判定是否需要首尾“...”
bool isAddFirst = false;
bool isAddMax = false;
if (showCount >= 7)
{
if (leftMin >= 2)
{
leftMin += 2;
isAddFirst = true;
}
if (rightMax <= MaxPage - 1)
{
rightMax -= 2;
isAddMax = true;
}
}
return GetSplicingPageHtml(currentIndex, rightMax, leftMin, isAddFirst, isAddMax);
}
/// <summary>
/// 处理左边最小页,右边最大页
/// </summary>
/// <param name="rightMax">返回右边</param>
/// <param name="leftMin">返回左边</param>
private void GetLimit(ref int rightMax, ref int leftMin)
{
//如果临近左边,显示不足一半,需要右边补充的数量
int offSetLeft = 1 - leftMin;
offSetLeft = offSetLeft < 0 ? 0 : offSetLeft;
//同样右边
int offSetRight = rightMax - MaxPage;
offSetRight = offSetRight < 0 ? 0 : offSetRight;
//判定处理offset
//分页末尾页码区域
if (offSetLeft > 0 && offSetRight == 0)
{
rightMax += offSetLeft;
if (rightMax > MaxPage)
{
rightMax = MaxPage;
}
}
//分页起始页码区域
else if (offSetRight > 0 && offSetLeft == 0)
{
leftMin -= offSetRight;
if (leftMin < 1) leftMin = 1;
}
}
/// <summary>
/// 拼接分页Html
/// </summary>
/// <param name="currentIndex">当前页</param>
/// <param name="rightMax">右边最大展示页</param>
/// <param name="leftMin">左边最小展示页数</param>
/// <param name="isAddFirst">是否需要首页</param>
/// <param name="isAddMax">是否需要尾页</param>
/// <returns></returns>
private string GetSplicingPageHtml(int currentIndex, int rightMax, int leftMin, bool isAddFirst, bool isAddMax)
{
StringBuilder str = new StringBuilder();
str.Append("<div class=\"u-page mt90 mb20 tc\">");
IsMinSize(currentIndex, str);
if (isAddFirst)
{
str.Append(string.Format("<a href=\"{0}\">{1}</a>", OnUrlGenerate(1), 1));
str.Append("<span>...</span>");
}
GetCenterPage(currentIndex, rightMax, leftMin, str);
if (isAddMax)
{
str.Append("<span>...</span>");
str.Append(string.Format("<a href=\"{0}\">{1}</a>", OnUrlGenerate(MaxPage), MaxPage));
}
IsMaxSize(currentIndex, str);
str.Append("</div>");
return str.ToString();
}
/// <summary>
/// 是否小于最小页处理
/// </summary>
/// <param name="currentIndex"></param>
/// <param name="str"></param>
private void IsMinSize(int currentIndex, StringBuilder str)
{
if (currentIndex <= 1)
{
str.Append(string.Format("<a class=\"disabled\">{0}</a>", string.IsNullOrEmpty(PrevText) ? "<" : PrevText));
}
else
{
str.Append(string.Format("<a class=\"u-p-prev\" href=\"{0}\">{1}</a>", OnUrlGenerate(currentIndex - 1), string.IsNullOrEmpty(PrevText) ? "<" : PrevText));
}
}
/// <summary>
/// 当前页大于最大页码处理
/// </summary>
/// <param name="currentIndex"></param>
/// <param name="str"></param>
private void IsMaxSize(int currentIndex, StringBuilder str)
{
if (currentIndex >= MaxPage)
{
str.Append(string.Format("<a class=\"disabled\" >{0}</a>", string.IsNullOrEmpty(NextText) ? ">" : NextText));
}
else
{
str.Append(string.Format("<a class=\"u-p-next\" href=\"{0}\">{1}</a>", OnUrlGenerate(currentIndex + 1), string.IsNullOrEmpty(NextText) ? ">" : NextText));
}
}
/// <summary>
/// 组装中间页码
/// </summary>
/// <param name="currentIndex"></param>
/// <param name="rightMax"></param>
/// <param name="leftMin"></param>
/// <param name="str"></param>
private void GetCenterPage(int currentIndex, int rightMax, int leftMin, StringBuilder str)
{
for (int item = leftMin; item <= rightMax; item++)
{
if (item == currentIndex)
{
str.Append(string.Format("<a class=\"u-p-on\">{0}</a>", item));
continue;
}
str.Append(string.Format("<a href=\"{0}\">{1}</a>", OnUrlGenerate(item), item));
}
}
}
在前端页面中代码,有样式和ajax请求
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<style>
a{text-decoration:none;transition:none}
.u-page { color: #999; font-size: 12px; }
.u-page a { display: inline-block; width: 40px; height: 38px; line-height: 38px; margin-left: -1px; border: 1px solid #eee; background-color: #fff; text-align: center; color: #999; }
.u-page .u-p-prev, .u-page .u-p-next { width: auto; padding: 0 20px; white-space: nowrap; }
.u-page span { display: inline-block; width: 40px; height: 40px; line-height: 40px; text-align: center; }
.u-page a:hover, .u-page a.u-p-on { background-color: #0057ff; border-color: #0057ff; color: #fff; }
</style>
</head>
<body>
<div id="content"></div>
<div id="page"></div>
<script src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
pageon(1, 4);
function pageon(pageindex, pagesize) {
$.post('/ajax_data.aspx?action=GetData', { pageindex: pageindex, pagesize: pagesize }, function (res) {
if (res != null && res.data != null && res.state == 1) {
$('#content').html(res.data);
$('#page').html(res.strte);
}
}, 'json');
}
</script>
</body>
</html>
数据处理中转页返回
public partial class ajax_data : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string action = Request.QueryString["action"];
if (!string.IsNullOrEmpty(action))
{
Type type = this.GetType();
MethodInfo method = type.GetMethod(action, BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod);
method.Invoke(this, null);
}
else
{
OutMsg("方法错误","", 0);
}
}
#region 获取数据
/// <summary>
/// 获取数据
/// </summary>
public void GetData()
{
int.TryParse(Request["pagesize"] + "", out int PageSize);
int.TryParse(Request["pageindex"] + "", out int PageIndex);
PageHelper pb = new PageHelper(10001, PageSize, i =>
{
return $"javascript:pageon({i},{PageSize})";//此处不想用ajax请求,可以跳转本页面,本页面后天获取页码,页面大小就行了
});
string data = $"当前页码为:{PageIndex}";
OutMsg(data,pb.GetString(PageIndex<0?0:PageIndex), 1);
}
#endregion
#region 返回信息
/// <summary>
/// 返回信息
/// </summary>
/// <param name="msg"></param>
/// <param name="state"></param>
private void OutMsg(string data, string strte, int state)
{
var res = new { state = state, data = data ,strte=strte};
Response.Write(JObject.FromObject(res));
Response.End();
}
#endregion
}