1、首先写一个Model(分页模型)MvcPagerInfo.cs(可放入AppCode中)
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Web.Mvc;
using System.Web;
using System.Text;
namespace community
{
public class MvcPagerInfo
{
private int _pageIndex;
public int PageIndex { get { return _pageIndex; } set { _pageIndex = value; } }
private int _pageSize;
public int PageSize { get { return _pageSize; } set { _pageSize = value; } }
private int _recordCount;
public int RecordCount { get { return _recordCount; } set { _recordCount = value; } }
/// <summary>
/// 当前状态下,最小的页码
/// </summary>
private int _lowPageNum;
public int LowPageNum { get { return _lowPageNum; } }
/// <summary>
/// 当前状态下,最大的页码
/// </summary>
private int _highPageNum;
public int HighPageNum { get { return _highPageNum; } }
/// <summary>
/// 一次性能显示多少页数
/// </summary>
private int _maxPageNum;
public int MaxPageNum { get { return _maxPageNum; } set { _maxPageNum = value; } }
private bool _showPageInfo = true;
public bool ShowPageInfo { get { return _showPageInfo; } set { _showPageInfo = value; } }
/// <summary>
/// 页数
/// </summary>
private int _pageCount;
public int PageCount { get { return _pageCount; } }
/// <summary>
/// 当前路径
/// </summary>
private string path;
public string Path { get { return path; } set { path = value; } }
private NameValueCollection queries;
public MvcPagerInfo()
{
}
public void Compose()
{
path = HttpContext.Current.Request.Url.AbsolutePath;
queries = new NameValueCollection(StringComparer.OrdinalIgnoreCase);
foreach (string key in HttpContext.Current.Request.QueryString.AllKeys)
{
if (key == null)
continue;
if (key.ToLower() != "page")
queries.Add(key, HttpContext.Current.Request.QueryString[key]);
}
if (_recordCount == 0)
_pageCount = 1;
else
_pageCount = (_recordCount % _pageSize == 0) ? (_recordCount / _pageSize) : ((_recordCount / _pageSize) + 1);
if (_maxPageNum >= _pageCount)//如果页数小于等于最大页面显示
{
_lowPageNum = 1;
_highPageNum = _pageCount;
}
else
{
int lhalf, rhalf;
if (_maxPageNum % 2 == 0)
{
lhalf = _maxPageNum / 2 - 1;
rhalf = _maxPageNum / 2;
}
else
lhalf = rhalf = _maxPageNum / 2;
_lowPageNum = (_pageIndex - lhalf > 0) ? (_pageIndex - lhalf) : 1;
_highPageNum = (_pageIndex + rhalf > _pageCount) ? _pageCount : (_pageIndex + rhalf < _maxPageNum ? _maxPageNum : _pageIndex + rhalf);
if (_lowPageNum > 1 && _highPageNum - _lowPageNum < _maxPageNum - 1)//校正
{
_lowPageNum = _highPageNum - _maxPageNum + 1;
}
}
}
public string GetFirstUrl()
{
return GenerateUrl(1);
}
public string GetLastUrl()
{
return GenerateUrl(_pageCount);
}
public string GetNextUrl()
{
return GenerateUrl(_pageIndex + 1);
}
public string GetPrevUrl()
{
return GenerateUrl(_pageIndex - 1);
}
public string GetCurrentUrl()
{
return GenerateUrl(_pageIndex);
}
public string GetUrl(int page)
{
return GenerateUrl(page);
}
private string GenerateUrl(int pageIndex)
{
StringBuilder sb = new StringBuilder();
foreach (string key in queries.AllKeys)
{
sb.Append(key + "=" + System.Web.HttpContext.Current.Server.UrlEncode(queries[key]) + "&");
}
sb.Append("page=" + pageIndex);
return path + "?" + sb.ToString();
}
public string GetPageInfo()
{
if (_showPageInfo)
{
string info = "共{0}条 第{4}条-{5}条 第{1}页/共{2}页 每页{3}条";
int startCurrentCount = (_pageIndex - 1) * _pageSize + 1;
int endCurrentCount = _pageIndex * _pageSize;
if (startCurrentCount > _recordCount)
startCurrentCount = _recordCount;
if (endCurrentCount > _recordCount)
endCurrentCount = _recordCount;
info = string.Format(info, _recordCount.ToString(), _pageIndex.ToString(), _pageCount.ToString(), _pageSize.ToString(), startCurrentCount.ToString(), endCurrentCount.ToString());
return info;
}
else
return "";
}
}
}
2、在控制器公用方法中添加分页方法BaseController.cs
#region fs 分页
protected int GetPageSize()
{
if (string.IsNullOrEmpty(Request.QueryString["pagesize"]))
return 10;
else
return Convert.ToInt32(Request.QueryString["pagesize"]);
}
protected int GetPageIndex()
{
if (string.IsNullOrEmpty(Request.QueryString["page"]))
{
if (string.IsNullOrEmpty(Request.QueryString["pageindex"]))
return 1;
else
return Convert.ToInt32(Request.QueryString["pageindex"]);
}
else
return Convert.ToInt32(Request.QueryString["page"]);
}
protected void AddPager(int recordCount, int PageSize)
{
AddPager(recordCount, false, PageSize);
}
protected void AddPager(int recordCount)
{
AddPager(recordCount, false);
}
protected void AddPager(int recordCount, bool showpageInfo)
{
AddPager(recordCount, showpageInfo, GetPageSize());
}
protected void AddPager(int recordCount, bool showpageInfo, int pageSize)
{
MvcPagerInfo pageinfo = new MvcPagerInfo();
pageinfo.PageIndex = GetPageIndex();
pageinfo.PageSize = pageSize;
pageinfo.RecordCount = recordCount;
pageinfo.MaxPageNum = 10;
pageinfo.Compose();
pageinfo.ShowPageInfo = showpageInfo;
ViewData.Add("pager", pageinfo);
}
/// <summary>
/// 是否列表要获取所有数据
/// </summary>
/// <returns></returns>
protected bool IsGetTotalData()
{
string total = Request.QueryString["total"];
if (total == "1" || this.GetPageSize() <= 0)
return true;
else
return false;
}
/// <summary>
/// 保存访问地址
/// </summary>
/// <param name="pageName"></param>
protected void SaveCurrentUrl(string pageName)
{
Session[pageName] = Request.Url.ToString();
}
/// <summary>
/// 获取访问地址
/// </summary>
/// <param name="pageName"></param>
protected string GetLastSavedUrl(string pageName)
{
if (Session[pageName] != null)
return Session[pageName].ToString();
else
return pageName;
}
#endregion
3、写一个一般处理程序Pager.ascx
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcPagerInfo>" %>
<%@ Import Namespace="community" %>
<%
string firstPage;
string prevPage;
string nextPage;
string lastPage;
// string currentPage;
if (Model != null && Model.RecordCount != 0)
{
firstPage = "<a id='firstPage' href=\"" + Model.GetFirstUrl() + "\">首页</a>";
lastPage = "<a href=\"" + Model.GetLastUrl() + "\">末页</a>";
if (Model.PageIndex == 1 || Model.PageCount < Model.PageIndex)
{
prevPage = "<span>上一页</span>";
}
else
{
prevPage = "<a href=\"" + Model.GetPrevUrl() + "\">上一页</a>";
}
if (Model.PageCount <= Model.PageIndex)
{
nextPage = "<span>下一页</span>";
}
else
{
nextPage = "<a href=\"" + Model.GetNextUrl() + "\">下一页</a>";
}
Response.Write("<span>" + Model.GetPageInfo() + "</span>");
Response.Write(firstPage);
Response.Write(prevPage);
for (int i = Model.LowPageNum; i <= Model.HighPageNum; i++)
{
string css = "";
if (Model.PageIndex == i)
css = " class=\"currentPage\"";
Response.Write("<a href=\"" + Model.GetUrl(i) + "\"" + css + ">" + i + "</a>");
}
if (Model.HighPageNum < Model.PageCount)
Response.Write("<a href=\"" + Model.GetUrl(Model.HighPageNum + 1) + "\">...</a>");
Response.Write(nextPage);
Response.Write(lastPage);
}
%>
4、分页模板 _Pager.cshtml(View/Shared中)
<div id="pagelist" class="pagelist">
@{ Html.RenderPartial("Pager", ViewData["pager"]);}
<input type='text' style='width:30px' οnkeyup='this.value=this.value.replace(/[^1-9]\d*$/,"")' value='@Request.QueryString["page"]' name='pageId' id='pageId'/>页
<!--
获取文本框的值作为跳转路径参数<a href="javascript:;" οnclick="location ='?page='+document.getElementById('pageId').value;">跳 转</a>
-->
<a href="javascript:;" οnclick="url()">跳 转</a>
</div>
<script type="text/javascript">
window.onload = function () {
if (!document.getElementById('firstPage')) {
document.getElementById("pagelist").style.display = "none";
}
if (document.getElementById('pageId').value == "") {
document.getElementById('pageId').value = 1;
}
}
function url() {
var str = document.getElementById("firstPage").getAttribute("href");
str=str.replace("page=1", "page=" + document.getElementById('pageId').value);
location.href = str;
}
</script>
5、View(视图),以后分页调用这个模板就好了
@{Html.RenderPartial("_Pager");}<!--将其放入需要分页的位置-->
6、CSS,分页在右下角显示
/*分页*/
.pagelist { text-align:right; padding:5px; color:#000; cursor:default;height: 31px;}
.pagelist a:link,.pagelist a:visited, .pagelist span{padding: 1px 3px 1px 3px;margin: 2px;text-decoration: none;min-width:12px;text-align:center;color:#2b5591;}
.pagelist a:hover{ background-color:#dedede}
.pagelist span{ color:#999}
.pagelist .currentPage{ font-weight:bold; color:red;}
.pagelist .txt{ width:25px}
7、Controller(控制器中)
public ActionResult View()
{
int total = 0;
int pageIndex = GetPageIndex();//当前页码
int pageSize = GetPageSize();//使用默认,每页10条数据
var model = BlogService.LoadLastestBrieves(pageSize, pageIndex, out total);//调用的方法
int totalCount = BlogService.TotalBlogs();//获取分页时数据总条数
AddPager(totalCount, true, pageSize);//分页时每页显示10条数据,页面显示“info = "共{0}条 第{4}条-{5}条 第{1}页/共{2}页 每页{3}条"",false则隐藏
SaveCurrentUrl("~/Admin/View");//保存当前路径,在AdminController中View下
return View(model);
}
8、单纯SQL语句分页,当然你也可以用存储过程进行分页
select * from (select *,ROW_NUMBER() over(order by ID) as rn from UserInfo where ...) where rn between @PageSize*(@PageIndex-1)+1 and @PageSize*@PageIndex
9、结果(http://localhost:XXXX/Admin/View中)
默认结果:(AddPager(totalCount))
详细结果:(AddPager(totalCount,true))
一个人的牛逼不如一群人的傻逼