一個(gè)Asp.Net的顯示分頁(yè)方法 附加實(shí)體轉(zhuǎn)換和存儲(chǔ)過程 帶源碼下載
之前自己一直用Aspnetpager控件來(lái)顯示項(xiàng)目中的分頁(yè),但是每次都要拖一個(gè)aspnetpager的控件進(jìn)去,感覺很不舒服,因?yàn)楝F(xiàn)在自己寫的webform都不用服務(wù)器控件了,所以自己仿照aspnetpager寫了一個(gè)精簡(jiǎn)實(shí)用的返回分頁(yè)顯示的html方法,其他話不說了,直接上代碼。
分頁(yè)顯示信息的實(shí)體類:
public class Pager
{
private string _firstPageText;
/// <summary>
/// 最前一頁(yè)文字顯示 默認(rèn)顯示為"首頁(yè)"
/// </summary>
public string FirstPageText
{
get {
return string.IsNullOrEmpty(_firstPageText)? "首頁(yè)" : _firstPageText;
}
set {
_firstPageText = value;
}
}
private string _prePageText;
/// <summary>
/// 上一頁(yè)文字顯示 默認(rèn)顯示為"上一頁(yè)"
/// </summary>
public string PrePageText
{
get
{
return string.IsNullOrEmpty(_prePageText) ? "上一頁(yè)" : _prePageText;
}
set
{
_prePageText = value;
}
}
private string _nextPageText;
/// <summary>
/// 下一頁(yè)文字顯示 默認(rèn)顯示為"下一頁(yè)"
/// </summary>
public string NextPageText
{
get
{
return string.IsNullOrEmpty(_nextPageText) ? "下一頁(yè)" : _nextPageText;
}
set
{
_nextPageText = value;
}
}
private string _lastPageText;
/// <summary>
/// 末頁(yè)文字顯示 默認(rèn)顯示為"末頁(yè)"
/// </summary>
public string LastPageText
{
get
{
return string.IsNullOrEmpty(_lastPageText) ? "末頁(yè)" : _lastPageText;
}
set
{
_lastPageText = value;
}
}
/// <summary>
/// 總記錄數(shù)
/// </summary>
public int RecordCount { get; set; }
private int _pagesize=15;
/// <summary>
/// 每頁(yè)分頁(yè)尺寸 默認(rèn)為15
/// </summary>
public int PageSize {
get {
return _pagesize == 0 ? 15 : _pagesize;
}set{
_pagesize = value;
}
}
private int _pageIndex=1;
/// <summary>
/// 當(dāng)前頁(yè)碼
/// </summary>
public int PageIndex {
get {
return _pageIndex == 0 ? 1 : _pageIndex;
}
set {
_pageIndex = value;
}
}
private int _maxShowPageSize = 10;
/// <summary>
/// 顯示頁(yè)碼列表的最大個(gè)數(shù) 默認(rèn)為10
/// </summary>
public int MaxShowPageSize {
get {
return _maxShowPageSize;
}
set {
_maxShowPageSize = value;
}
}
private string _queryStringName;
/// <summary>
/// 頁(yè)碼在瀏覽器中傳值的名稱 默認(rèn)為page
/// </summary>
public string QueryStringName {
get {
return string.IsNullOrEmpty(_queryStringName)? "page" : _queryStringName;
}
set {
_queryStringName = value;
}
}
/// <summary>
/// 頁(yè)面的URL
/// </summary>
public string URL {
get {
string url = HttpContext.Current.Request.Url.AbsoluteUri;//當(dāng)前頁(yè)面絕對(duì)路徑
if (EnableUrlRewriting)//使用url重寫
{
url=url.Substring(0, url.LastIndexOf("/") + 1);//獲取當(dāng)前頁(yè)面的目錄路徑
url += UrlRewritePattern;
}
else {//普通帶問號(hào)的頁(yè)面?zhèn)髦?BR> //demo.aspx
//demo.aspx?a=1
//demo.aspx?page=1
//demo.aspx?a=2&page=1
if (url.Contains("aspx?"))
{
if (Regex.IsMatch(url,@"page=[0-9]*$",RegexOptions.IgnoreCase))//如果存在page=*的字符串
{
url = Regex.Replace(url, @"page=[0-9]*$", "", RegexOptions.IgnoreCase);//替換掉page=*的字符串
}
url += QueryStringName + "={0}";
}
else {
url += "?" + QueryStringName + "={0}";
}
}
return url;
}
}
private bool _enableUrlRewriting;
/// <summary>
/// URL是否重寫 默認(rèn)為flase
/// </summary>
public bool EnableUrlRewriting {
get {
return (object)_enableUrlRewriting == null ? false : _enableUrlRewriting;
}
set {
_enableUrlRewriting = value;
}
}
/// <summary>
/// 頁(yè)面URL重寫規(guī)則,將頁(yè)碼傳值用{0}來(lái)代替 比如list-1-{0}.html,啟用該功能需要將EnableUrlRewriting屬性設(shè)為true
/// </summary>
public string UrlRewritePattern { get; set; }
private string _className;
/// <summary>
/// 分頁(yè)容器的css名稱
/// </summary>
public string ClassName {
get {
return string.IsNullOrEmpty(_className) ? "paginator" : _className;
}set{
_className = value;
}
}
private string _currentPageCss;
/// <summary>
/// 當(dāng)前頁(yè)面按鈕css
/// </summary>
public string CurrentPageButtonCss {
get {
return string.IsNullOrEmpty(_currentPageCss) ? "cpb" : _currentPageCss;
}set{
_currentPageCss = value;
}
}
private bool _showSpanText;
/// <summary>
/// Span 標(biāo)簽中文字信息是否顯示 默認(rèn)為false不顯示
/// </summary>
public bool ShowSpanText {
get {
return (object)_showSpanText == null ? false : _showSpanText;
}
set {
_showSpanText = value;
}
}
private string _spanTextClass;
/// <summary>
/// 分頁(yè)文字描述span標(biāo)簽css
/// </summary>
public string SpanTextClass {
get {
return string.IsNullOrEmpty(_spanTextClass) ? "stc" : _spanTextClass;
}
set {
_spanTextClass = value;
}
}
private string _submitButtonText;
/// <summary>
/// 確定按鈕文字顯示 默認(rèn)顯示"確定"
/// </summary>
public string SubmitButtonText {
get {
return string.IsNullOrEmpty(_submitButtonText) ? "確定" : _submitButtonText;
}
set {
_submitButtonText = value;
}
}
}
分頁(yè)顯示html代碼的拼接方法:
public class SplitManager
{
public static string AspNetPagers(Pager pager)
{
StringBuilder sb = new StringBuilder();
string attr="";
int pagecount = 0;//當(dāng)前頁(yè)面的總層數(shù)
int floorcount = 0;//分頁(yè)的總層數(shù)
int currentLastPage = 0;//當(dāng)前最后一頁(yè)的頁(yè)碼
int pageNum = pager.RecordCount / pager.PageSize + 1;//總頁(yè)數(shù) 1~24
sb.AppendFormat("<div class=\"{0}\">\n", pager.ClassName);
attr=pager.PageIndex==1?"disabled=disabled":"";//標(biāo)志當(dāng)前頁(yè)第一頁(yè)是否相等 來(lái)控制前倆個(gè)按鈕的有效性
sb.AppendFormat(GetAHtml(attr,string.Format(pager.URL,1),pager.FirstPageText));//添加最前一頁(yè)的代碼
sb.AppendFormat(GetAHtml(attr, string.Format(pager.URL, pager.PageIndex-1), pager.PrePageText));//添加上一頁(yè)的代碼
pagecount = pager.PageIndex/pager.MaxShowPageSize;//當(dāng)前頁(yè)數(shù) 0~1~2
pagecount = pager.PageIndex % pager.MaxShowPageSize == 0 ? pagecount - 1 : pagecount;//清除當(dāng) 當(dāng)前頁(yè)數(shù)為分頁(yè)頁(yè)碼數(shù)的整數(shù)倍頁(yè)時(shí)除數(shù)多一的狀況
floorcount = pageNum / pager.MaxShowPageSize;//頁(yè)面層數(shù) 0~1~2
currentLastPage=pageNum<pager.MaxShowPageSize * (pagecount + 1)?pageNum:pager.MaxShowPageSize * (pagecount + 1);
if (pager.PageIndex > pager.MaxShowPageSize)//當(dāng)當(dāng)前序號(hào)大于每頁(yè)頁(yè)碼個(gè)數(shù)時(shí)顯示再前端...
{
sb.AppendFormat(GetAHtml("", string.Format(pager.URL, pager.MaxShowPageSize * pagecount), "..."));
}
for (int i = pager.MaxShowPageSize * pagecount + 1; i <= currentLastPage; i++)
{
if (i == pager.PageIndex)//判斷循環(huán)頁(yè)面是否為當(dāng)前頁(yè)
{
sb.AppendFormat(GetSpanHtml(i, pager.CurrentPageButtonCss));
}
else {
sb.AppendFormat(GetAHtml("", string.Format(pager.URL, i),i.ToString()));
}
}
if (pager.PageIndex <= pager.MaxShowPageSize * floorcount)//當(dāng)當(dāng)前序號(hào)小于倒數(shù)第二頁(yè)頁(yè)碼時(shí)顯示在后端...
{
sb.AppendFormat(GetAHtml("", string.Format(pager.URL, pager.MaxShowPageSize * (pagecount + 1) + 1), "..."));
}
attr = pager.PageIndex == pageNum ? "disabled=disabled" : "";//標(biāo)志當(dāng)前頁(yè)最后一頁(yè)是否相等 來(lái)控制后倆個(gè)按鈕的有效性
sb.AppendFormat(GetAHtml(attr, string.Format(pager.URL, pager.PageIndex+1), pager.NextPageText));//添加后一頁(yè)的代碼
sb.AppendFormat(GetAHtml(attr, string.Format(pager.URL, pageNum), pager.LastPageText));//添加最后一頁(yè)的代碼
if (pager.ShowSpanText)//是否顯示分頁(yè)文字span標(biāo)簽顯示
{
sb.AppendFormat("<span class=\"" + pager.SpanTextClass + "\">共{0}頁(yè),每頁(yè){1}條記錄 \n", pageNum, pager.PageSize);
sb.AppendFormat("到第<input type=\"input\" id=\"jumpNum\" style=\"width:20px;\" name=\"jump\" value=\"{0}\" />頁(yè)", pager.PageIndex == pageNum ? pageNum : pager.PageIndex + 1);
sb.AppendFormat("<a href=\"#\" style=\"float:none;\" onclick=\"javascript:jump();\">" + pager.SubmitButtonText + "</a></span>\n");
sb.Append(GetJumpScript(pager.URL));//添加按鈕跳轉(zhuǎn)的javascript代碼
}
sb.AppendFormat("</div>");//
return sb.ToString();
}
/// <summary>
/// get the html of a label
/// </summary>
/// <param name="title">a's title</param>
/// <param name="url">the url of a</param>
/// <param name="attr">the attribute</param>
/// <returns>return html string</returns>
private static string GetAHtml(string attr,string url,string title)
{
return "<a " + attr + " href=\""+url+"\" style=\"margin-right:5px;\">"+title+"</a>\n";
}
/// <summary>
/// get the html of a label
/// </summary>
/// <param name="num">the content of span</param>
/// <param name="className">Class style Name</param>
/// <returns>return html string </returns>
private static string GetSpanHtml(int num, string className)
{
return "<span class=\"" + className + "\">" + num + "</span>\n";
}
/// <summary>
/// 獲取跳轉(zhuǎn)的javascript代碼
/// </summary>
/// <param name="url">當(dāng)前分頁(yè)的url規(guī)則</param>
/// <returns>返回一個(gè)javascript代碼</returns>
private static string GetJumpScript(string url)
{
string scriptstr = "<script type=\"text/javascript\">\n" +
"function jump(){\n" +
"var jnum=document.getElementById(\"jumpNum\").value;\n" +
"if(isNaN(jnum)){\n"+
"alert(\"在跳轉(zhuǎn)框中請(qǐng)輸入數(shù)字!\");\n" +
"}\n"+
"else{\n"+
//"alert(jnum);\n" +
"location.href=String.format(\"" + url + "\",jnum);\n" +
"}\n"+
"}\n"+
"String.format = function() {\n"+
"if( arguments.length == 0 )\n"+
"return null; \n"+
"var str = arguments[0]; \n"+
"for(var i=1;i<arguments.length;i++) {\n"+
"var re = new RegExp('\\\\{' + (i-1) + '\\\\}','gm');\n"+
"str = str.replace(re, arguments[i]);\n"+
"}\n"+
"return str;\n"+
"}\n"+
"</script>\n";
return scriptstr;
}
}
最精簡(jiǎn)必要的幾個(gè)參數(shù)傳進(jìn)去就能顯示分頁(yè)效果了:
protected string str = "";
protected void Page_Load(object sender, EventArgs e)
{
Pager pager = new Pager() { RecordCount = 350,
PageSize = 15,
MaxShowPageSize=10,
PageIndex = Convert.ToInt32(Request.QueryString["page"]),
ShowSpanText=true};
str = SplitManager.AspNetPagers(pager);
}
仿csdn的分頁(yè)的效果圖

供測(cè)試的css:
View Code
<style type="text/css">
/*分頁(yè)樣式控制的開始*/
.paginator { font: 12px Arial, Helvetica, sans-serif;
padding:10px 20px 10px 0;
margin: 0px;}
.paginator a {border:solid 1px #ccc;
color:#0063dc;
cursor:pointer;
text-decoration:none;}
.paginator a:visited {padding: 1px 6px;
border: solid 1px #ddd;
background: #f0f1f1;
text-decoration: none;}
.paginator .cpb {border:1px solid #14316b;
font-weight:700;
color:#f0f1f1;
background-color:#1f3d76;}
.paginator a:hover {border:solid 1px #14316b;
color:#14316b;
text-decoration:none;}
.paginator a,.paginator a:visited,.paginator .cpb,.paginator a:hover{float:left;
height:16px;
line-height:16px;
min-width:10px;_width:10px;
margin-right:5px;
text-align:center;
white-space:nowrap;
font-size:12px;
font-family:
Arial,SimSun;
padding:0 3px;}
.paginator .stc{color:#999;margin-left:20px;}
.paginator .stc a{margin-left:10px;}
/*分頁(yè)樣式控制的結(jié)束*/
</style>
同時(shí)配合為了配合分頁(yè),再給出一個(gè)DataTable轉(zhuǎn)泛型列表的一個(gè)方法和一個(gè)分頁(yè)存儲(chǔ)過程。
此轉(zhuǎn)換方法需配合相應(yīng)的實(shí)體類,并且實(shí)體類中需對(duì)象相應(yīng)表的字段名,不區(qū)分大小寫。
#region DataTable To List/Model
/// <summary>
/// DataTable To List
/// </summary>
/// <typeparam name="TType">object type</typeparam>
/// <param name="dt">DataTable</param>
/// <returns>return a List Model type</returns>
public static List<T> DataTableToObjectList<T>(DataTable dt) where T : new()
{
DataRowCollection drc = dt.Rows;
int columncount = drc.Count;
List<T> result = new List<T>(); //declare the generic type of return
Type type = typeof(T);
PropertyInfo[] propertys = type.GetProperties(BindingFlags.IgnoreCase|BindingFlags.Instance|BindingFlags.Public|BindingFlags.SetProperty); //get the collections of the model
foreach (DataRow r in drc)
{
result.Add(DataRowToObjectModel<T>(r, propertys));
}
return result;
}
/// <summary>
/// DataRow To a Model
/// </summary>
/// <typeparam name="T">the type of Model</typeparam>
/// <param name="r">DataRow</param>
/// <param name="propertys">the object to Model</param>
/// <returns>return a Model Type</returns>
private static T DataRowToObjectModel<T>(DataRow r, PropertyInfo[] propertys) where T : new()
{
T t = new T();
for (int i = 0; i < propertys.Length; i++)
{
object obj = r[propertys[i].Name];
if (obj != null)
{
if (propertys[i].PropertyType == typeof(int))
propertys[i].SetValue(t, PublicMethod.GetInt(obj), null);
if (propertys[i].PropertyType == typeof(string))
propertys[i].SetValue(t, obj.ToString(), null);
if (propertys[i].PropertyType == typeof(DateTime))
propertys[i].SetValue(t, PublicMethod.GetDateTime(obj), null);
}
}
return t;
}
#endregion
分頁(yè)存儲(chǔ)過程。
CREATE PROCEDURE [dbo].[proc_SplitPage]
-- Add the parameters for the stored procedure here
@tblName varchar(255), -- 表名
@strFields varchar(1000) = '*', -- 需要返回的列,默認(rèn)*
@strOrder varchar(255)='', -- 排序的字段名,必填
@strOrderType varchar(10)='ASC', -- 排序的方式,默認(rèn)ASC
@PageSize int = 10, -- 頁(yè)尺寸,默認(rèn)10
@PageIndex int = 1, -- 頁(yè)碼,默認(rèn)1
@strWhere varchar(1500) = '' -- 查詢條件 (注意: 不要加 where)
AS
declare @strSQL varchar(5000)
if @strWhere !=''
set @strWhere=' where '+@strWhere
set @strSQL=
'SELECT '+@strFields+' FROM ('+
'SELECT ROW_NUMBER() OVER (ORDER BY '+@strOrder+' '+@strOrderType+') AS pos,'+@strFields+' '+
'FROM '+@tblName+' '+@strWhere+
') AS sp
WHERE pos BETWEEN '+str((@PageIndex-1)*@PageSize+1)+' AND '+str(@PageIndex*@PageSize)
exec (@strSQL)
以上是全部代碼,由于本人還是新手,請(qǐng)大家查找問題并指導(dǎo),謝謝。
有些朋友需要源碼的再此下載,方便測(cè)試
- 分享一個(gè)asp.net pager分頁(yè)控件
- Asp.Net數(shù)據(jù)控件引用AspNetPager.dll分頁(yè)實(shí)現(xiàn)代碼
- asp.net中使用自定義控件的方式實(shí)現(xiàn)一個(gè)分頁(yè)控件的代碼
- asp.net jquery無(wú)刷新分頁(yè)插件(jquery.pagination.js)
- asp.net自定義分頁(yè)控件示例
- asp.net利用后臺(tái)實(shí)現(xiàn)直接生成html分頁(yè)的方法
- ASP.NET MVC 5使用X.PagedList.Mvc進(jìn)行分頁(yè)教程(PagedList.Mvc)
- 簡(jiǎn)單好用的ASP.NET分頁(yè)類(支持AJAX、自定義文字)
- asp.net中如何調(diào)用sql存儲(chǔ)過程實(shí)現(xiàn)分頁(yè)
- ASP.NET MVC4 HtmlHelper擴(kuò)展類,實(shí)現(xiàn)分頁(yè)功能
相關(guān)文章
.NET微信開發(fā)之PC 端微信掃碼注冊(cè)和登錄功能實(shí)現(xiàn)
這篇文章主要介紹了.NET微信開發(fā)之PC 端微信掃碼注冊(cè)和登錄功能實(shí)現(xiàn)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09asp.net中Post表單保存頁(yè)面狀態(tài)并輸出源碼的實(shí)現(xiàn)方法
先執(zhí)行腳本,復(fù)制源碼到隱藏域里,再輸出源碼,注意代碼紅色設(shè)置2012-08-08合并網(wǎng)頁(yè)中的多個(gè)script引用實(shí)現(xiàn)思路及代碼
為了更好的進(jìn)行封裝,每個(gè)實(shí)現(xiàn)不同功能的js代碼應(yīng)該有自己的js文件,這樣如果一個(gè)網(wǎng)頁(yè)中引用了多個(gè)js文件會(huì)很難管理,所以就出現(xiàn)了合并js這以說,感興趣的朋友不妨參考下本文希望對(duì)你有所幫助2013-02-02Asp.net XMLHTTP封裝類(GET,Post發(fā)送和接收數(shù)據(jù))
XMLHTTP封裝類可以向遠(yuǎn)程發(fā)送URL和參數(shù),接受返回信息(無(wú)亂碼)2008-11-11asp.net TextBox回車觸發(fā)事件 圖片在img顯示
TextBox回車觸發(fā)事件 數(shù)據(jù)庫(kù)取圖片在img顯示2009-10-10微軟ajax庫(kù)的使用方法(ajax.ajaxMethod)
使用AjaxMethod可以在客戶端異步調(diào)用服務(wù)端方法,簡(jiǎn)單地說就是在JS里調(diào)用后臺(tái).cs文件里的方法,做一些JS無(wú)法做到的操作,如查詢數(shù)據(jù)庫(kù)2013-08-08Asp.net(C#)實(shí)現(xiàn)驗(yàn)證碼功能代碼
asp.net驗(yàn)證碼的實(shí)現(xiàn)方法2008-10-10