适用于WebForm Mvc的Pager分页组件C#实现
本文为大家分享了自己写的一个Pager分页组件,WebForm,Mvc都适用,具体内容如下
分页控件其实就是根据链接在页面间传递参数,因为我看到MVC中你可以看到这样传递参数的new{para=val}这种方式传递参数,于是我想到用可以模仿这种传递参数的方式,那就用dynamic来作为参数对象传递。
下面是附上我写的具体的实现的代码
数据处理代码:
1.定义IPagedList接口
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
namespaceInfrastruction.Pager
{
publicinterfaceIPagedList
{
intpageIndex{get;set;}
intpageSize{get;set;}
inttotalItemCount{get;set;}
inttotalPageCount{get;}
}
}
2.实现IPagedList接口
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Web;
namespaceInfrastruction.Pager
{
publicclassPagedList<T>:List<T>,IPagedList
{
publicintpageIndex
{
get;
set;
}
publicintpageSize
{
get;
set;
}
publicinttotalItemCount
{
get;
set;
}
publicinttotalPageCount
{
get
{
returntotalItemCount%pageSize==0?(totalItemCount/pageSize):(totalItemCount/pageSize+1);
}
}
publicPagedList(IEnumerable<T>sources,intpageIndex,intpageSize)
{
if(sources!=null&&sources.Any())
{
this.AddRange(sources.Skip(pageSize*(pageIndex-1)).Take(pageSize).ToList());
}
this.pageIndex=pageIndex;
this.pageSize=pageSize;
this.totalItemCount=sources.Count();
}
}
}
分页标签处理代码:
3.PagerHelper
usingInfrastruction.Pager;
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Reflection;
usingSystem.Text;
usingSystem.Web;
usingSystem.Web.UI;
namespaceSystem.Web.UI
{
publicstaticclassPagerHelper
{
publicstaticstringPager(stringurl,IPagedListpagedList)
{
StringBuilderbuilder=newStringBuilder();
if(pagedList!=null)
{
builder.Append("<scripttype='text/javascript'>");
builder.Append("window.onload=function(){");
builder.Append("varelements=document.getElementById('pager').childNodes;");
builder.Append("for(vari=0;i<elements.length;i++){");
builder.Append("vartxt=elements[i].innerText||elements[i].textContent;");
builder.Append("if(elements[i].nodeType=='1'&&txt=='"+pagedList.pageIndex+"'){");
builder.Append("elements[i].style.textDecoration='underline';break;}}}");
builder.Append("</script>");
builder.Append("<divid='pager'>");
builder.Append("<spanclass='p'>");
builder.AppendFormat("共{0}条数据页次:{1}/{2}",pagedList.totalItemCount,pagedList.pageIndex,pagedList.totalPageCount,"上一页");
builder.Append("</span>");
builder.Append(" ");
builder.Append(" ");
builder.Append(" ");
builder.Append(" ");
if(pagedList.pageIndex>1&&pagedList.pageIndex<=pagedList.totalPageCount)
{
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?pageIndex={1}'>{2}</a>",url,1,"首页");
builder.Append("</span>");
builder.Append(" ");
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?pageIndex={1}'>{2}</a>",url,pagedList.pageIndex-1,"上一页");
builder.Append("</span>");
builder.Append(" ");
}
if(pagedList.totalPageCount>1&&pagedList.totalPageCount<=10)
{
for(inti=1;i<=pagedList.totalPageCount;i++)
{
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?pageIndex={1}'>{2}</a>",url,i,i);
builder.Append("</span>");
builder.Append(" ");
}
}
elseif(pagedList.totalPageCount>10)
{
if(pagedList.pageIndex<11)
{
for(inti=1;i<=10;i++)
{
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?pageIndex={1}'>{2}</a>",url,i,i);
builder.Append("</span>");
builder.Append(" ");
}
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?pageIndex={1}'>{2}</a>",url,11,"...");
builder.Append("</span>");
builder.Append(" ");
}
else
{
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?pageIndex={1}'>{2}</a>",url,(pagedList.pageIndex-6),"...");
builder.Append("</span>");
builder.Append(" ");
if(pagedList.pageIndex>=11&&pagedList.totalPageCount<=pagedList.pageIndex+5)
{
for(inti=pagedList.pageIndex-5;i<=pagedList.totalPageCount;i++)
{
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?pageIndex={1}'>{2}</a>",url,i,i);
builder.Append("</span>");
builder.Append(" ");
}
}
else
{
for(inti=pagedList.pageIndex-5;i<=pagedList.pageIndex+5;i++)
{
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?pageIndex={1}'>{2}</a>",url,i,i);
builder.Append("</span>");
builder.Append(" ");
}
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?pageIndex={1}'>{2}</a>",url,(pagedList.pageIndex+6),"...");
builder.Append("</span>");
builder.Append(" ");
}
}
}
if(pagedList.pageIndex>=1&&pagedList.pageIndex<pagedList.totalPageCount)
{
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?pageIndex={1}'>{2}</a>",url,pagedList.pageIndex+1,"下一页");
builder.Append("</span>");
builder.Append(" ");
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?pageIndex={1}'>{2}</a>",url,pagedList.totalPageCount,"尾页");
builder.Append("</span>");
builder.Append(" ");
}
builder.Append("</div>");
}
returnbuilder.ToString();
}
publicstaticstringPager(stringurl,IPagedListpagedList,dynamicobjAttr)
{
StringBuilderbuilder=newStringBuilder();
if(pagedList!=null)
{
builder.Append("<scripttype='text/javascript'>");
builder.Append("window.onload=function(){");
builder.Append("varelements=document.getElementById('pager').childNodes;");
builder.Append("for(vari=0;i<elements.length;i++){");
builder.Append("vartxt=elements[i].innerText||elements[i].textContent;");
builder.Append("if(elements[i].nodeType=='1'&&txt=='"+pagedList.pageIndex+"'){");
builder.Append("elements[i].style.textDecoration='underline';break;}}}");
builder.Append("</script>");
stringparas="";
PropertyInfo[]infos=objAttr.GetType().GetProperties();
if(infos!=null&&infos.Any())
{
foreach(varitemininfos)
{
paras+=string.Format("{0}={1}",item.Name,item.GetValue(objAttr,null));
paras+="&";
}
}
paras=paras+"pageIndex=";
builder.Append("<divid='pager'>");
builder.Append("<spanclass='p'>");
builder.AppendFormat("共{0}条数据页次:{1}/{2}",pagedList.totalItemCount,pagedList.pageIndex,pagedList.totalPageCount,"上一页");
builder.Append("</span>");
builder.Append(" ");
builder.Append(" ");
builder.Append(" ");
builder.Append(" ");
if(pagedList.pageIndex>1&&pagedList.pageIndex<=pagedList.totalPageCount)
{
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?{1}'>{2}</a>",url,paras+1,"首页");
builder.Append("</span>");
builder.Append(" ");
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?{1}'>{2}</a>",url,paras+(pagedList.pageIndex-1),"上一页");
builder.Append("</span>");
builder.Append(" ");
}
if(pagedList.totalPageCount>1&&pagedList.totalPageCount<=10)
{
for(inti=1;i<=pagedList.totalPageCount;i++)
{
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?{1}'>{2}</a>",url,paras+i,i);
builder.Append("</span>");
builder.Append(" ");
}
}
elseif(pagedList.totalPageCount>10)
{
if(pagedList.pageIndex<11)
{
for(inti=1;i<=10;i++)
{
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?{1}'>{2}</a>",url,paras+i,i);
builder.Append("</span>");
builder.Append(" ");
}
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?{1}'>{2}</a>",url,paras+11,"...");
builder.Append("</span>");
builder.Append(" ");
}
else
{
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?{1}'>{2}</a>",url,paras+(pagedList.pageIndex-6),"...");
builder.Append("</span>");
builder.Append(" ");
if(pagedList.pageIndex>=11&&pagedList.totalPageCount<=pagedList.pageIndex+5)
{
for(inti=pagedList.pageIndex-5;i<=pagedList.totalPageCount;i++)
{
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?{1}'>{2}</a>",url,paras+i,i);
builder.Append("</span>");
builder.Append(" ");
}
}
else
{
for(inti=pagedList.pageIndex-5;i<=pagedList.pageIndex+5;i++)
{
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?{1}'>{2}</a>",url,paras+i,i);
builder.Append("</span>");
builder.Append(" ");
}
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?{1}'>{2}</a>",url,paras+(pagedList.pageIndex+6),"...");
builder.Append("</span>");
builder.Append(" ");
}
}
}
if(pagedList.pageIndex>=1&&pagedList.pageIndex<pagedList.totalPageCount)
{
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?{1}'>{2}</a>",url,paras+(pagedList.pageIndex+1),"下一页");
builder.Append("</span>");
builder.Append(" ");
builder.Append("<spanclass='p'>");
builder.AppendFormat("<ahref='{0}?{1}'>{2}</a>",url,paras+pagedList.totalPageCount,"尾页");
builder.Append("</span>");
builder.Append(" ");
}
builder.Append("</div>");
}
returnbuilder.ToString();
}
}
}
4. PagerLinqExtension(基于linq的扩展)
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Linq.Expressions;
usingSystem.Web;
namespaceInfrastruction.Pager
{
publicstaticclassPagerLinqExtension
{
publicstaticPagedList<T>ToPagedList<T>(thisIQueryable<T>source,intpageIndex,intpageSize)
{
returnnewPagedList<T>(source,pageIndex,pageSize);
}
}
}
调用方法
1.Webform调用: <%=PagerHelper.Pager("Products.aspx",pageList,new{cid=Cid})%> 或者用literal在后台绑定也行
2.Mvc调用:
需要扩展一下方法
namespaceSystem.Web.Mvc.Html
{
publicstaticclassHtmlExtension
{
publicstaticIHtmlStringPager(thisHtmlHelperhelper,stringurl,IPagedListpagedList)
{
returnhelper.Raw(PagerHelper.Pager(url,pagedList));
}
publicstaticIHtmlStringPager(thisHtmlHelperhelper,stringurl,IPagedListpagedList,dynamicobjAttr)
{
returnhelper.Raw(PagerHelper.Pager(url,pagedList,objAttr));
}
}
}
然后页面调用@Html.Pager("Products.aspx",pageList,new{cid=Cid,......})
全部的代码都在上面,希望大家认真学习,对大家学习使用分页控件有所帮助。