这两天自己模仿写的一个Asp.Net的显示分页方法 附加实体转换和存储过程
之前自己一直用Aspnetpager控件来显示项目中的分页,但是每次都要拖一个aspnetpager的控件进去,感觉很不舒服,因为现在自己写的webform都不用服务器控件了,所以自己仿照aspnetpager写了一个精简实用的返回分页显示的html方法,其他话不说了,直接上代码。
分页显示信息的实体类:
public class Pager
{
private string _firstPageText;
/// <summary>
/// 最前一页文字显示 默认显示为"首页"
/// </summary>
public string FirstPageText
{
get {
return string.IsNullOrEmpty(_firstPageText)? "首页" : _firstPageText;
}
set {
_firstPageText = value;
}
}
private string _prePageText;
/// <summary>
/// 上一页文字显示 默认显示为"上一页"
/// </summary>
public string PrePageText
{
get
{
return string.IsNullOrEmpty(_prePageText) ? "上一页" : _prePageText;
}
set
{
_prePageText = value;
}
}
private string _nextPageText;
/// <summary>
/// 下一页文字显示 默认显示为"下一页"
/// </summary>
public string NextPageText
{
get
{
return string.IsNullOrEmpty(_nextPageText) ? "下一页" : _nextPageText;
}
set
{
_nextPageText = value;
}
}
private string _lastPageText;
/// <summary>
/// 末页文字显示 默认显示为"末页"
/// </summary>
public string LastPageText
{
get
{
return string.IsNullOrEmpty(_lastPageText) ? "末页" : _lastPageText;
}
set
{
_lastPageText = value;
}
}
/// <summary>
/// 总记录数
/// </summary>
public int RecordCount { get; set; }
private int _pagesize=15;
/// <summary>
/// 每页分页尺寸 默认为15
/// </summary>
public int PageSize {
get {
return _pagesize == 0 ? 15 : _pagesize;
}set{
_pagesize = value;
}
}
private int _pageIndex=1;
/// <summary>
/// 当前页码
/// </summary>
public int PageIndex {
get {
return _pageIndex == 0 ? 1 : _pageIndex;
}
set {
_pageIndex = value;
}
}
private int _maxShowPageSize = 10;
/// <summary>
/// 显示页码列表的最大个数 默认为10
/// </summary>
public int MaxShowPageSize {
get {
return _maxShowPageSize;
}
set {
_maxShowPageSize = value;
}
}
private string _queryStringName;
/// <summary>
/// 页码在浏览器中传值的名称 默认为page
/// </summary>
public string QueryStringName {
get {
return string.IsNullOrEmpty(_queryStringName)? "page" : _queryStringName;
}
set {
_queryStringName = value;
}
}
/// <summary>
/// 页面的URL
/// </summary>
public string URL {
get {
string url = HttpContext.Current.Request.Url.AbsoluteUri;//当前页面绝对路径
if (EnableUrlRewriting)//使用url重写
{
url=url.Substring(0, url.LastIndexOf("/") + 1);//获取当前页面的目录路径
url += UrlRewritePattern;
}
else {//普通带问号的页面传值
//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是否重写 默认为flase
/// </summary>
public bool EnableUrlRewriting {
get {
return (object)_enableUrlRewriting == null ? false : _enableUrlRewriting;
}
set {
_enableUrlRewriting = value;
}
}
/// <summary>
/// 页面URL重写规则,将页码传值用{0}来代替 比如list-1-{0}.html,启用该功能需要将EnableUrlRewriting属性设为true
/// </summary>
public string UrlRewritePattern { get; set; }
private string _className;
/// <summary>
/// 分页容器的css名称
/// </summary>
public string ClassName {
get {
return string.IsNullOrEmpty(_className) ? "paginator" : _className;
}set{
_className = value;
}
}
private string _currentPageCss;
/// <summary>
/// 当前页面按钮css
/// </summary>
public string CurrentPageButtonCss {
get {
return string.IsNullOrEmpty(_currentPageCss) ? "cpb" : _currentPageCss;
}set{
_currentPageCss = value;
}
}
private bool _showSpanText;
/// <summary>
/// Span 标签中文字信息是否显示 默认为false不显示
/// </summary>
public bool ShowSpanText {
get {
return (object)_showSpanText == null ? false : _showSpanText;
}
set {
_showSpanText = value;
}
}
private string _spanTextClass;
/// <summary>
/// 分页文字描述span标签css
/// </summary>
public string SpanTextClass {
get {
return string.IsNullOrEmpty(_spanTextClass) ? "stc" : _spanTextClass;
}
set {
_spanTextClass = value;
}
}
private string _submitButtonText;
/// <summary>
/// 确定按钮文字显示 默认显示"确定"
/// </summary>
public string SubmitButtonText {
get {
return string.IsNullOrEmpty(_submitButtonText) ? "确定" : _submitButtonText;
}
set {
_submitButtonText = value;
}
}
}
分页显示html代码的拼接方法:
public class SplitManager
{
public static string AspNetPagers(Pager pager)
{
StringBuilder sb = new StringBuilder();
string attr="";
int pagecount = 0;//当前页面的总层数
int floorcount = 0;//分页的总层数
int currentLastPage = 0;//当前最后一页的页码
int pageNum = pager.RecordCount / pager.PageSize + 1;//总页数 1~24
sb.AppendFormat("<div class=\"{0}\">\n", pager.ClassName);
attr=pager.PageIndex==1?"disabled=disabled":"";//标志当前页第一页是否相等 来控制前俩个按钮的有效性
sb.AppendFormat(GetAHtml(attr,string.Format(pager.URL,1),pager.FirstPageText));//添加最前一页的代码
sb.AppendFormat(GetAHtml(attr, string.Format(pager.URL, pager.PageIndex-1), pager.PrePageText));//添加上一页的代码
pagecount = pager.PageIndex/pager.MaxShowPageSize;//当前页数 0~1~2
pagecount = pager.PageIndex % pager.MaxShowPageSize == 0 ? pagecount - 1 : pagecount;//清除当 当前页数为分页页码数的整数倍页时除数多一的状况
floorcount = pageNum / pager.MaxShowPageSize;//页面层数 0~1~2
currentLastPage=pageNum<pager.MaxShowPageSize * (pagecount + 1)?pageNum:pager.MaxShowPageSize * (pagecount + 1);
if (pager.PageIndex > pager.MaxShowPageSize)//当当前序号大于每页页码个数时显示再前端...
{
sb.AppendFormat(GetAHtml("", string.Format(pager.URL, pager.MaxShowPageSize * pagecount), "..."));
}
for (int i = pager.MaxShowPageSize * pagecount + 1; i <= currentLastPage; i++)
{
if (i == pager.PageIndex)//判断循环页面是否为当前页
{
sb.AppendFormat(GetSpanHtml(i, pager.CurrentPageButtonCss));
}
else {
sb.AppendFormat(GetAHtml("", string.Format(pager.URL, i),i.ToString()));
}
}
if (pager.PageIndex <= pager.MaxShowPageSize * floorcount)//当当前序号小于倒数第二页页码时显示在后端...
{
sb.AppendFormat(GetAHtml("", string.Format(pager.URL, pager.MaxShowPageSize * (pagecount + 1) + 1), "..."));
}
attr = pager.PageIndex == pageNum ? "disabled=disabled" : "";//标志当前页最后一页是否相等 来控制后俩个按钮的有效性
sb.AppendFormat(GetAHtml(attr, string.Format(pager.URL, pager.PageIndex+1), pager.NextPageText));//添加后一页的代码
sb.AppendFormat(GetAHtml(attr, string.Format(pager.URL, pageNum), pager.LastPageText));//添加最后一页的代码
if (pager.ShowSpanText)//是否显示分页文字span标签显示
{
sb.AppendFormat("<span class=\"" + pager.SpanTextClass + "\">共{0}页,每页{1}条记录 \n", pageNum, pager.PageSize);
sb.AppendFormat("到第<input type=\"input\" id=\"jumpNum\" style=\"width:20px;\" name=\"jump\" value=\"{0}\" />页", 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));//添加按钮跳转的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>
/// 获取跳转的javascript代码
/// </summary>
/// <param name="url">当前分页的url规则</param>
/// <returns>返回一个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(\"在跳转框中请输入数字!\");\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;
}
}
最精简必要的几个参数传进去就能显示分页效果了:
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的分页的效果图

供测试的css:
<style type="text/css">
/*分页样式控制的开始*/
.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;
}
.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;}
/*分页样式控制的结束*/
</style>
同时配合为了配合分页,再给出一个DataTable转泛型列表的一个方法和一个分页存储过程。
此转换方法需配合相应的实体类,并且实体类中需对象相应表的字段名,不区分大小写。
#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
分页存储过程。
CREATE PROCEDURE [dbo].[proc_SplitPage]
-- Add the parameters for the stored procedure here
@tblName varchar(255), -- 表名
@strFields varchar(1000) = '*', -- 需要返回的列,默认*
@strOrder varchar(255)='', -- 排序的字段名,必填
@strOrderType varchar(10)='ASC', -- 排序的方式,默认ASC
@PageSize int = 10, -- 页尺寸,默认10
@PageIndex int = 1, -- 页码,默认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)
以上是全部代码,由于本人还是新人,请个人查找问题并指导,谢谢。
这两天自己模仿写的一个Asp.Net的显示分页方法 附加实体转换和存储过程的更多相关文章
- 多年前写的一个ASP.NET网站管理系统,到现在有些公司在用
多年前写的一个ASP.NET网站管理系统,到现在有些公司在用 今早上接到一个电话,自已多年前写的一个ASP.NET网站管理系统,一个公司在用,出了点问题, 第一点是惊奇,5,6年前的东东,手机号码换了 ...
- 模仿写了一个摸鱼APP解决原作者的问题
前几天见到微博里有人提到摸鱼APP,发现需要在windows store下载才可以使用,文件约100多M左右的样子,自已没有登录微软Store的习惯.想想只有一个介面,没有必要这么大,于是,自已动手写 ...
- 小白写的一个ASP.NET分页控件,仅供娱乐
无聊,第一次写博客,自己动手写了一个分页控件.由于我是新手,有很多地方写得不够好,希望各位大牛多多指正.哈哈哈 /// <summary> /// 分页控件 /// </summar ...
- 曹工杂谈:花了两天时间,写了一个netty实现的http客户端,支持同步转异步和连接池(1)--核心逻辑讲解
背景 先说下写这个的目的,其实是好奇,dubbo是怎么实现同步转异步的,然后了解到,其依赖了请求中携带的请求id来完成这个连接复用:然后我又发现,redisson这个redis客户端,底层也是用的ne ...
- 自己写的一个ASP.NET服务器控件Repeater和GridView分页类
不墨迹,直接上代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; usin ...
- appium+python:自己写的一个滑动控件的方式
#调用方式roll_ele("ID","ele_id","7","up",3)#将控件分为7格,从底部倒数第二格向上滑动 ...
- 用C3中的animation和transform写的一个模仿加载的时动画效果
用用C3中的animation和transform写的一个模仿加载的时动画效果! 不多说直接上代码; html标签部分 <div class="wrap"> <h ...
- Js 正则表达式 写了一个正整数或小数点或分数前两个正则表达式
写了一个正整数或小数点或分数前两个正则表达式 /^[0-9]+([.]{1}[0-9]{1,2})? $/ 版权声明:本文博客原创文章.博客,未经同意,不得转载.
- 写了一个Windows API Viewer,提供VBA语句的导出功能。提供两万多个API的MSDN链接内容的本地查询
始出处:http://www.cnblogs.com/Charltsing/p/APIViewer.html QQ:564955427,QQ群:550672198 世面上的API Viewer已经不少 ...
随机推荐
- SVN基础操作
SVN基础操作 安装 #大多数Linux版本自带svn svn --version #如果没有安装可用yum安装 yum install subversion 生命周期 创建版本库 检出 更新 执行变 ...
- 李群与李代数在slam中的应用
昨天,刚接触道了李群和李代数,查了许多资料,也看了一些视屏.今天来谈谈自己的感受. 李群是有一个挪威数学家提出的,在十九二十世纪得到了很大的发展. 其归于非组合数学,现在简单介绍李群和李代数的概念.群 ...
- [翻译]:Cinemachine 官方文档(0)
目录 Overview : Installation and Getting Started :安装并开始 User Guide :用户指南 What is Cinemachine? : 什么是Cin ...
- Jmeter使用笔记之意料之外的
以下是在测试过程中按照以前loadrunner的思维来做的一点区别: 一.组织方式之setup 在用loadrunner做接口测试的时候如果不是针对login的测试,那么一般也会把login接口放到i ...
- Orchard是如何运行的
建立一个CMS网站(内容管理系统)是不同于建立一个普通的web站点:它更像是建立一个应用程序容器. 设计这样一个系统时,必须建立一流的可扩展性功能.这必需是一个非常开放式的构架,但是一个开放性的系统可 ...
- 通过动态包含和Ajax机制抽取Web应用的公共页面
在Java Web应用开发中,经常遇到的一种情况是,许多的页面中都包含着“公共页面”,这部分动态页面的特征是:访问量大,会带来较大的性能压力.功能设计上会动态地改变自身的元素.比如在登录前和登录后所展 ...
- LOJ#551 Matrix
本地打表在线AC什么的最喜欢了. 题意 \(\rm Alice\)和\(\rm Bob\)在玩游戏,他们要给一个\(n\times n\)的矩阵打标记.初始时没有任何标记,每一轮\(\rm Bob\) ...
- 洛谷P3275 [SCOI2011]糖果(差分约束,最长路,Tarjan,拓扑排序)
洛谷题目传送门 差分约束模板题,等于双向连0边,小于等于单向连0边,小于单向连1边,我太蒻了,总喜欢正边权跑最长路...... 看遍了讨论版,我是真的不敢再入复杂度有点超级伪的SPFA的坑了 为了保证 ...
- 搜索引擎(Solr-搜索详解)
学习目标 1.掌握SOLR的搜索工作流程: 2.掌握solr搜索的表示语法及查询解析器 3.熟悉solr搜索的JSON格式 API Solr搜索流程介绍 回顾,使用 lucene进行搜索的步骤: So ...
- bzoj1178/luogu3626 会议中心 (倍增+STL::set)
贪心地,可以建出一棵树,每个区间对应一个点,它的父亲是它右边的.与它不相交的.右端点最小的区间. 为了方便,再加入一个[0,0]区间 于是就可以倍增来做出从某个区间开始,一直到某个右界,这之中最多能选 ...