如何自学制作MVC4框架下的高效分页控件?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2901个文字,预计阅读时间需要12分钟。
在MVC4框架下,若需要实现分页功能,而系统中没有现成的分页控件,可以自己编写一个HtmlHelper-Pager。在编写之前,可以先浏览一些优秀的分页控件,以便获得灵感。以下是一个简单的分页控件的设计思路:
分页控件设计思路:
1. 分页控件功能: - 显示当前页码。 - 显示总页数。 - 提供上一页和下一页的导航。 - 提供跳转到指定页面的功能。
2. 分页控件结构: - 使用HTML和CSS来构建分页控件的界面。 - 使用JavaScript来处理分页逻辑和用户交互。
3. 分页控件实现: - 获取当前页码、总页数和每页显示的记录数。 - 根据当前页码计算分页控件的显示内容。 - 创建HTML元素来显示分页控件,包括页码、导航按钮等。 - 使用JavaScript添加事件监听器,处理用户点击事件。
4. 分页控件代码示例:
共 {{ total }} 条记录,第 {{ currentPage }}/{{ totalPages }} 页 首页 上一页 =totalPages ? 'style=display:none' : '' }}>下一页 尾页
#pager { /* 分页控件样式 */ } #pager a { /* 链接样式 */ } #pager input { /* 输入框样式 */ }
通过以上设计思路和代码示例,可以创建一个简单的分页控件。在实际应用中,可以根据需求进一步优化和扩展分页控件的功能和样式。
浏览栏目下内容的时候肯定要用到分页,MVC4下没有带分页控件,那么就自己写一个HtmlHelper-Pager。写之前看了一些大神的分页控件,启发很大。先设想一下自己的分页控件
分页控件分普通分页(Pager)和Ajax分页(PagerAjax)两块。两块的显示相同,如图:
各部说明:
在开始写之前还要先有两个类:一个是分页设置类,一个是分页数据类。
分页的设置类包含了常用的分页参数,是为了方便保存到数据库中,可以直接在栏目中设置该栏目下每页显示的记录数;记录的计量单位:是“条”还是“篇”;记录的名称是“新闻”、“文章”还是“教程”等。
分页设置模型
分页数据类
用来提供记录列表和分页设置PagerData<T> 继承自 List<T>
想好直接之后,开始设置基础函数
1、pager的基础函数
复制代码 代码如下:Pager(this HtmlHelper htmlHelper, string actionName, string controllerName, RouteValueDictionary routeValues, PagerConfig pageConfig, string ctrlId, string cssClass, int digitalLinkNum, bool showTotalRecord, bool showCurrentPage, bool showTotalPage, bool showSelect, bool showInput)
参数说明:
actionName-动作名称;
controllerName-控制器名称;
routeValues-路由参数;
pageConfig-分页配置;
ctrlId-分页控件Id;
cssClass-分页控件css类名;
digitalLinkNum-显示的数字链接个数;
showTotalRecord-显示总记录数;
showCurrentPage-显示当前页;
showTotalPage-显示总页数;
showSelect-显示页码下拉框;
showInput-显示页码输入框。
重载可能用到参数
currentPage-当前页;
totalPage-总页数;
pageSize-每页显示记录数;
totalRecord-总记录数;
recordUnit-记录单位;
recordName-记录名称;
2、PagerAjax基础函数
复制代码 代码如下:public static MvcHtmlString PagerAjax(this HtmlHelper htmlHelper, string ctnrId, string actionName, string controllerName, RouteValueDictionary routeValues, PagerConfig pageConfig, string ctrlId, string cssClass, int digitalLinkNum, bool showTotalRecord, bool showCurrentPage, bool showTotalPage, bool showSelect, bool showInput)
参数说明:
ctnrId-内容容器Id。用于包裹ajax返回html的容器控件id
其他参数与1、pager相同
==========================
基本的东西都准备好了,写代码就快了。
右键点击Extensions文件夹,添加类PagerExtensions
命名空间改为System.Web.Mvc,在该命名空间下先写PagerConfig,再写PagerData,代码都很简单。
namespace System.Web.Mvc { /// <summary> /// 分页配置 /// </summary> public class PagerConfig { [Key] public int PagerConfigId { get; set; } /// <summary> /// 当前页 /// </summary> [NotMapped] public int CurrentPage { get; set; } /// <summary> /// 每页记录数 /// </summary> [Display(Name = "每页记录数", Description = "每页显示的记录数。")] [Required(ErrorMessage="×")] public int PageSize { get; set; } /// <summary> /// 总页数 /// </summary> [NotMapped] public int TotalPage { get { return (int)Math.Ceiling(TotalRecord / (double)PageSize); } } /// <summary> /// 总记录数 /// </summary> [NotMapped] public int TotalRecord { get; set; } /// <summary> /// 记录单位 /// </summary> [Display(Name="记录单位",Description="记录的数量单位。如文章为“篇”;新闻为“条”")] [Required(ErrorMessage = "×")] public string RecordUnit { get; set; } /// <summary> /// 记录名称 /// </summary> [Display(Name = "记录名称", Description = "记录的名称。如“文章”、“新闻”、“教程”等")] [Required(ErrorMessage = "×")] public string RecordName { get; set; } public PagerConfig() { CurrentPage = 1; PageSize = 20; RecordUnit = "条"; RecordName = "记录"; } } /// <summary> /// 分页数据 /// </summary> public class PagerData<T> : List<T> { public PagerData(List<T> list, PagerConfig pagerConfig) { this.AddRange(list); Config = pagerConfig; } public PagerData(List<T> list, int currentPage, int pageSize, int totalRecord) { this.AddRange(list); Config.CurrentPage = currentPage; Config.PageSize = pageSize; Config.TotalRecord = totalRecord; } public PagerData(List<T> list, int currentPage, int pageSize, int totalRecord, string recordUnit, string recordName) { this.AddRange(list); Config.CurrentPage = currentPage; Config.PageSize = pageSize; Config.TotalRecord = totalRecord; Config.RecordUnit = recordUnit; Config.RecordName = recordName; } public PagerConfig Config { get; set; } } }
下面到了关键部分:
在文件PagerExtensions.cs底部再添加一个命名空间namespace System.Web.Mvc.Html。
在里面添加静态类public static class PagerExtensions。
在类中间添加函数public static MvcHtmlString Pager(……)
代码也很容易就是用UrlHelper.Action生成链接的地址,再创建一个StringBuilder _strBuilder,不停的向里面附加html代码,最后使用return MvcHtmlString.Create(_strBuilder.ToString());返回MvcHtmlString。就是写的太乱啦
public static MvcHtmlString Pager(this HtmlHelper htmlHelper, string actionName, string controllerName, RouteValueDictionary routeValues, PagerConfig pageConfig, string ctrlId, string cssClass, int digitalLinkNum, bool showTotalRecord, bool showCurrentPage, bool showTotalPage, bool showSelect, bool showInput) { UrlHelper _url = new UrlHelper(htmlHelper.ViewContext.RequestContext); StringBuilder _strBuilder = new StringBuilder("<div id=\"" + ctrlId + "\" class=\"" + cssClass + "\">"); if (showTotalRecord) _strBuilder.Append("共" + pageConfig.TotalRecord + pageConfig.RecordUnit + pageConfig.RecordName + " "); if (showCurrentPage) _strBuilder.Append("每页" + pageConfig.PageSize + pageConfig.RecordUnit + " "); if(showTotalPage) _strBuilder.Append("第" + pageConfig.CurrentPage + "页/共" + pageConfig.TotalPage + "页 "); //首页链接 if (pageConfig.CurrentPage > 1) { routeValues["page"] = 1; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">首页</a>"); } else _strBuilder.Append("<span class=\"btn\">首页</span>"); //上一页 if (pageConfig.CurrentPage > 1) { routeValues["page"] = pageConfig.CurrentPage - 1; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">上一页</a>"); } else _strBuilder.Append("<span class=\"btn\">上一页</span>"); //数字导航开始 int _startPage, _endPage; //总页数少于要显示的页数,页码全部显示 if (digitalLinkNum >= pageConfig.TotalPage) { _startPage = 1; _endPage = pageConfig.TotalPage; } else//显示指定数量的页码 { int _forward = (int)Math.Ceiling(digitalLinkNum / 2.0); if (pageConfig.CurrentPage > _forward)//起始页码大于1 { _endPage = pageConfig.CurrentPage + digitalLinkNum - _forward; if (_endPage > pageConfig.TotalPage)//结束页码大于总页码结束页码为最后一页 { _startPage = pageConfig.TotalPage - digitalLinkNum; _endPage = pageConfig.TotalPage; } else _startPage = pageConfig.CurrentPage - _forward; } else//起始页码从1开始 { _startPage = 1; _endPage = digitalLinkNum; } } //向上… if (_startPage > 1) { routeValues["page"] = _startPage - 1; _strBuilder.Append("<a class=\"linkbatch\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">…</a>"); } //数字 for (int i = _startPage; i <= _endPage; i++) { if (i != pageConfig.CurrentPage) { routeValues["page"] = i; _strBuilder.Append("<a class=\"linknum\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">" + i.ToString() + "</a>"); } else { _strBuilder.Append("<span class='currentnum'>" + i.ToString() + "</span>"); } } //向下… if (_endPage < pageConfig.TotalPage) { routeValues["page"] = _endPage + 1; _strBuilder.Append("<a class=\"linkbatch\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">…</a>"); } ////数字导航结束 //下一页和尾页 if (pageConfig.CurrentPage < pageConfig.TotalPage) { routeValues["page"] = pageConfig.CurrentPage + 1; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">下一页</a>"); routeValues["page"] = pageConfig.TotalPage; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">尾页</a>"); } else _strBuilder.Append("<span class=\"btn\">下一页</span><span class=\"btn\">尾页</span>"); //显示页码下拉框 if (showSelect) { routeValues["page"] = "-nspageselecturl-"; _strBuilder.Append(" 跳转到第<select id=\"nspagerselect\" data-url=\"" + _url.Action(actionName, controllerName, routeValues) + "\">"); for (int i = 1; i <= pageConfig.TotalPage; i++) { if (i == pageConfig.CurrentPage) _strBuilder.Append("<option selected=\"selected\" value=\"" + i + "\">" + i + "</option>"); else _strBuilder.Append("<option value=\"" + i + "\">" + i + "</option>"); } _strBuilder.Append("</select>页"); _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " #nspagerselect\").change(function () { location.href = $(\"#" + ctrlId + " #nspagerselect\").attr(\"data-url\").replace(\"-nspageselecturl-\", $(\"#" + ctrlId + " #nspagerselect\").val());});</script>"); } //显示页码输入框 if (showInput) { routeValues["page"] = "-nspagenumurl-"; _strBuilder.Append("转到第<input id=\"nspagernum\" type=\"text\" data-url=\"" + _url.Action(actionName, controllerName, routeValues) + "\" />页"); _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " #nspagernum\").keydown(function (event) {if (event.keyCode == 13) location.href = $(\"#" + ctrlId + " #nspagernum\").attr(\"data-url\").replace(\"-nspagenumurl-\", $(\"#" + ctrlId + " #nspagernum\").val()); });</script>"); } _strBuilder.Append("</div>"); return MvcHtmlString.Create(_strBuilder.ToString()); }
PagerAjax跟Pager基本一样。不同点是在点击链接的时候Pager是转到相应页面,PagerAjax是在点击paer内的链接的时候利用jquery Post获取链接指定页面的html代码替换内容包裹容器的html。实际上就是这句jquery语句
复制代码 代码如下:<script type="text/javascript">$("#ctrlId a").click(function () {$.post($(this).attr("href"), function (data) {$("#ctnrId").html(data);});return false; });</script>
PagerAjax的整个内容
public static MvcHtmlString PagerAjax(this HtmlHelper htmlHelper, string ctnrId, string actionName, string controllerName, RouteValueDictionary routeValues, PagerConfig pageConfig, string ctrlId, string cssClass, int digitalLinkNum, bool showTotalRecord, bool showCurrentPage, bool showTotalPage, bool showSelect, bool showInput) { UrlHelper _url = new UrlHelper(htmlHelper.ViewContext.RequestContext); StringBuilder _strBuilder = new StringBuilder("<div id=\"" + ctrlId + "\" class=\"" + cssClass + "\">"); if (showTotalRecord) _strBuilder.Append("共" + pageConfig.TotalRecord + pageConfig.RecordUnit + pageConfig.RecordName + " "); if (showCurrentPage) _strBuilder.Append("每页" + pageConfig.PageSize + pageConfig.RecordUnit + " "); if (showTotalPage) _strBuilder.Append("第" + pageConfig.CurrentPage + "页/共" + pageConfig.TotalPage + "页 "); //首页链接 if (pageConfig.CurrentPage > 1) { routeValues["page"] = 1; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">首页</a>"); } else _strBuilder.Append("<span class=\"btn\">首页</span>"); //上一页 if (pageConfig.CurrentPage > 1) { routeValues["page"] = pageConfig.CurrentPage - 1; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">上一页</a>"); } else _strBuilder.Append("<span class=\"btn\">上一页</span>"); //数字导航开始 int _startPage, _endPage; //总页数少于要显示的页数,页码全部显示 if (digitalLinkNum >= pageConfig.TotalPage) { _startPage = 1; _endPage = pageConfig.TotalPage; } else//显示指定数量的页码 { int _forward = (int)Math.Ceiling(digitalLinkNum / 2.0); if (pageConfig.CurrentPage > _forward)//起始页码大于1 { _endPage = pageConfig.CurrentPage + digitalLinkNum - _forward; if (_endPage > pageConfig.TotalPage)//结束页码大于总页码结束页码为最后一页 { _startPage = pageConfig.TotalPage - digitalLinkNum; _endPage = pageConfig.TotalPage; } else _startPage = pageConfig.CurrentPage - _forward; } else//起始页码从1开始 { _startPage = 1; _endPage = digitalLinkNum; } } //向上… if (_startPage > 1) { routeValues["page"] = _startPage - 1; _strBuilder.Append("<a class=\"linkbatch\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">…</a>"); } //数字 for (int i = _startPage; i <= _endPage; i++) { if (i != pageConfig.CurrentPage) { routeValues["page"] = i; _strBuilder.Append("<a class=\"linknum\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">" + i.ToString() + "</a>"); } else { _strBuilder.Append("<span class='currentnum'>" + i.ToString() + "</span>"); } } //向下… if (_endPage < pageConfig.TotalPage) { routeValues["page"] = _endPage + 1; _strBuilder.Append("<a class=\"linkbatch\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">…</a>"); } ////数字导航结束 //下一页和尾页 if (pageConfig.CurrentPage < pageConfig.TotalPage) { routeValues["page"] = pageConfig.CurrentPage + 1; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">下一页</a>"); routeValues["page"] = pageConfig.TotalPage; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">尾页</a>"); } else _strBuilder.Append("<span class=\"btn\">下一页</span><span class=\"btn\">尾页</span>"); //显示页码下拉框 if (showSelect) { routeValues["page"] = "-nspageselecturl-"; _strBuilder.Append(" 跳转到第<select id=\"nspagerselect\" data-url=\"" + _url.Action(actionName, controllerName, routeValues) + "\">"); for (int i = 1; i <= pageConfig.TotalPage; i++) { if (i == pageConfig.CurrentPage) _strBuilder.Append("<option selected=\"selected\" value=\"" + i + "\">" + i + "</option>"); else _strBuilder.Append("<option value=\"" + i + "\">" + i + "</option>"); } _strBuilder.Append("</select>页"); _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " #nspagerselect\").change(function () {$.post($(\"#" + ctrlId + " #nspagerselect\").attr(\"data-url\").replace(\"-nspageselecturl-\", $(\"#" + ctrlId + " #nspagerselect\").val()), function (data) {$(\"#" + ctnrId + "\").html(data);});});</script>"); } //显示页码输入框 if (showInput) { routeValues["page"] = "-nspagenumurl-"; _strBuilder.Append(" 转到第<input id=\"nspagernum\" type=\"text\" data-url=\"" + _url.Action(actionName, controllerName, routeValues) + "\" />页"); _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " #nspagernum\").keydown(function (event) {if (event.keyCode == 13) { $.post($(\"#" + ctrlId + " #nspagernum\").attr(\"data-url\").replace(\"-nspagenumurl-\", $(\"#" + ctrlId + " #nspagernum\").val()), function (data) {$(\"#" + ctnrId + "\").html(data);}); } });</script>"); } _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " a\").click(function () {$.post($(this).attr(\"href\"), function (data) {$(\"#" + ctnrId + "\").html(data);});return false; });</script>"); _strBuilder.Append("</div>"); return MvcHtmlString.Create(_strBuilder.ToString()); }
完工
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。
本文共计2901个文字,预计阅读时间需要12分钟。
在MVC4框架下,若需要实现分页功能,而系统中没有现成的分页控件,可以自己编写一个HtmlHelper-Pager。在编写之前,可以先浏览一些优秀的分页控件,以便获得灵感。以下是一个简单的分页控件的设计思路:
分页控件设计思路:
1. 分页控件功能: - 显示当前页码。 - 显示总页数。 - 提供上一页和下一页的导航。 - 提供跳转到指定页面的功能。
2. 分页控件结构: - 使用HTML和CSS来构建分页控件的界面。 - 使用JavaScript来处理分页逻辑和用户交互。
3. 分页控件实现: - 获取当前页码、总页数和每页显示的记录数。 - 根据当前页码计算分页控件的显示内容。 - 创建HTML元素来显示分页控件,包括页码、导航按钮等。 - 使用JavaScript添加事件监听器,处理用户点击事件。
4. 分页控件代码示例:
共 {{ total }} 条记录,第 {{ currentPage }}/{{ totalPages }} 页 首页 上一页 =totalPages ? 'style=display:none' : '' }}>下一页 尾页
#pager { /* 分页控件样式 */ } #pager a { /* 链接样式 */ } #pager input { /* 输入框样式 */ }
通过以上设计思路和代码示例,可以创建一个简单的分页控件。在实际应用中,可以根据需求进一步优化和扩展分页控件的功能和样式。
浏览栏目下内容的时候肯定要用到分页,MVC4下没有带分页控件,那么就自己写一个HtmlHelper-Pager。写之前看了一些大神的分页控件,启发很大。先设想一下自己的分页控件
分页控件分普通分页(Pager)和Ajax分页(PagerAjax)两块。两块的显示相同,如图:
各部说明:
在开始写之前还要先有两个类:一个是分页设置类,一个是分页数据类。
分页的设置类包含了常用的分页参数,是为了方便保存到数据库中,可以直接在栏目中设置该栏目下每页显示的记录数;记录的计量单位:是“条”还是“篇”;记录的名称是“新闻”、“文章”还是“教程”等。
分页设置模型
分页数据类
用来提供记录列表和分页设置PagerData<T> 继承自 List<T>
想好直接之后,开始设置基础函数
1、pager的基础函数
复制代码 代码如下:Pager(this HtmlHelper htmlHelper, string actionName, string controllerName, RouteValueDictionary routeValues, PagerConfig pageConfig, string ctrlId, string cssClass, int digitalLinkNum, bool showTotalRecord, bool showCurrentPage, bool showTotalPage, bool showSelect, bool showInput)
参数说明:
actionName-动作名称;
controllerName-控制器名称;
routeValues-路由参数;
pageConfig-分页配置;
ctrlId-分页控件Id;
cssClass-分页控件css类名;
digitalLinkNum-显示的数字链接个数;
showTotalRecord-显示总记录数;
showCurrentPage-显示当前页;
showTotalPage-显示总页数;
showSelect-显示页码下拉框;
showInput-显示页码输入框。
重载可能用到参数
currentPage-当前页;
totalPage-总页数;
pageSize-每页显示记录数;
totalRecord-总记录数;
recordUnit-记录单位;
recordName-记录名称;
2、PagerAjax基础函数
复制代码 代码如下:public static MvcHtmlString PagerAjax(this HtmlHelper htmlHelper, string ctnrId, string actionName, string controllerName, RouteValueDictionary routeValues, PagerConfig pageConfig, string ctrlId, string cssClass, int digitalLinkNum, bool showTotalRecord, bool showCurrentPage, bool showTotalPage, bool showSelect, bool showInput)
参数说明:
ctnrId-内容容器Id。用于包裹ajax返回html的容器控件id
其他参数与1、pager相同
==========================
基本的东西都准备好了,写代码就快了。
右键点击Extensions文件夹,添加类PagerExtensions
命名空间改为System.Web.Mvc,在该命名空间下先写PagerConfig,再写PagerData,代码都很简单。
namespace System.Web.Mvc { /// <summary> /// 分页配置 /// </summary> public class PagerConfig { [Key] public int PagerConfigId { get; set; } /// <summary> /// 当前页 /// </summary> [NotMapped] public int CurrentPage { get; set; } /// <summary> /// 每页记录数 /// </summary> [Display(Name = "每页记录数", Description = "每页显示的记录数。")] [Required(ErrorMessage="×")] public int PageSize { get; set; } /// <summary> /// 总页数 /// </summary> [NotMapped] public int TotalPage { get { return (int)Math.Ceiling(TotalRecord / (double)PageSize); } } /// <summary> /// 总记录数 /// </summary> [NotMapped] public int TotalRecord { get; set; } /// <summary> /// 记录单位 /// </summary> [Display(Name="记录单位",Description="记录的数量单位。如文章为“篇”;新闻为“条”")] [Required(ErrorMessage = "×")] public string RecordUnit { get; set; } /// <summary> /// 记录名称 /// </summary> [Display(Name = "记录名称", Description = "记录的名称。如“文章”、“新闻”、“教程”等")] [Required(ErrorMessage = "×")] public string RecordName { get; set; } public PagerConfig() { CurrentPage = 1; PageSize = 20; RecordUnit = "条"; RecordName = "记录"; } } /// <summary> /// 分页数据 /// </summary> public class PagerData<T> : List<T> { public PagerData(List<T> list, PagerConfig pagerConfig) { this.AddRange(list); Config = pagerConfig; } public PagerData(List<T> list, int currentPage, int pageSize, int totalRecord) { this.AddRange(list); Config.CurrentPage = currentPage; Config.PageSize = pageSize; Config.TotalRecord = totalRecord; } public PagerData(List<T> list, int currentPage, int pageSize, int totalRecord, string recordUnit, string recordName) { this.AddRange(list); Config.CurrentPage = currentPage; Config.PageSize = pageSize; Config.TotalRecord = totalRecord; Config.RecordUnit = recordUnit; Config.RecordName = recordName; } public PagerConfig Config { get; set; } } }
下面到了关键部分:
在文件PagerExtensions.cs底部再添加一个命名空间namespace System.Web.Mvc.Html。
在里面添加静态类public static class PagerExtensions。
在类中间添加函数public static MvcHtmlString Pager(……)
代码也很容易就是用UrlHelper.Action生成链接的地址,再创建一个StringBuilder _strBuilder,不停的向里面附加html代码,最后使用return MvcHtmlString.Create(_strBuilder.ToString());返回MvcHtmlString。就是写的太乱啦
public static MvcHtmlString Pager(this HtmlHelper htmlHelper, string actionName, string controllerName, RouteValueDictionary routeValues, PagerConfig pageConfig, string ctrlId, string cssClass, int digitalLinkNum, bool showTotalRecord, bool showCurrentPage, bool showTotalPage, bool showSelect, bool showInput) { UrlHelper _url = new UrlHelper(htmlHelper.ViewContext.RequestContext); StringBuilder _strBuilder = new StringBuilder("<div id=\"" + ctrlId + "\" class=\"" + cssClass + "\">"); if (showTotalRecord) _strBuilder.Append("共" + pageConfig.TotalRecord + pageConfig.RecordUnit + pageConfig.RecordName + " "); if (showCurrentPage) _strBuilder.Append("每页" + pageConfig.PageSize + pageConfig.RecordUnit + " "); if(showTotalPage) _strBuilder.Append("第" + pageConfig.CurrentPage + "页/共" + pageConfig.TotalPage + "页 "); //首页链接 if (pageConfig.CurrentPage > 1) { routeValues["page"] = 1; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">首页</a>"); } else _strBuilder.Append("<span class=\"btn\">首页</span>"); //上一页 if (pageConfig.CurrentPage > 1) { routeValues["page"] = pageConfig.CurrentPage - 1; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">上一页</a>"); } else _strBuilder.Append("<span class=\"btn\">上一页</span>"); //数字导航开始 int _startPage, _endPage; //总页数少于要显示的页数,页码全部显示 if (digitalLinkNum >= pageConfig.TotalPage) { _startPage = 1; _endPage = pageConfig.TotalPage; } else//显示指定数量的页码 { int _forward = (int)Math.Ceiling(digitalLinkNum / 2.0); if (pageConfig.CurrentPage > _forward)//起始页码大于1 { _endPage = pageConfig.CurrentPage + digitalLinkNum - _forward; if (_endPage > pageConfig.TotalPage)//结束页码大于总页码结束页码为最后一页 { _startPage = pageConfig.TotalPage - digitalLinkNum; _endPage = pageConfig.TotalPage; } else _startPage = pageConfig.CurrentPage - _forward; } else//起始页码从1开始 { _startPage = 1; _endPage = digitalLinkNum; } } //向上… if (_startPage > 1) { routeValues["page"] = _startPage - 1; _strBuilder.Append("<a class=\"linkbatch\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">…</a>"); } //数字 for (int i = _startPage; i <= _endPage; i++) { if (i != pageConfig.CurrentPage) { routeValues["page"] = i; _strBuilder.Append("<a class=\"linknum\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">" + i.ToString() + "</a>"); } else { _strBuilder.Append("<span class='currentnum'>" + i.ToString() + "</span>"); } } //向下… if (_endPage < pageConfig.TotalPage) { routeValues["page"] = _endPage + 1; _strBuilder.Append("<a class=\"linkbatch\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">…</a>"); } ////数字导航结束 //下一页和尾页 if (pageConfig.CurrentPage < pageConfig.TotalPage) { routeValues["page"] = pageConfig.CurrentPage + 1; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">下一页</a>"); routeValues["page"] = pageConfig.TotalPage; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">尾页</a>"); } else _strBuilder.Append("<span class=\"btn\">下一页</span><span class=\"btn\">尾页</span>"); //显示页码下拉框 if (showSelect) { routeValues["page"] = "-nspageselecturl-"; _strBuilder.Append(" 跳转到第<select id=\"nspagerselect\" data-url=\"" + _url.Action(actionName, controllerName, routeValues) + "\">"); for (int i = 1; i <= pageConfig.TotalPage; i++) { if (i == pageConfig.CurrentPage) _strBuilder.Append("<option selected=\"selected\" value=\"" + i + "\">" + i + "</option>"); else _strBuilder.Append("<option value=\"" + i + "\">" + i + "</option>"); } _strBuilder.Append("</select>页"); _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " #nspagerselect\").change(function () { location.href = $(\"#" + ctrlId + " #nspagerselect\").attr(\"data-url\").replace(\"-nspageselecturl-\", $(\"#" + ctrlId + " #nspagerselect\").val());});</script>"); } //显示页码输入框 if (showInput) { routeValues["page"] = "-nspagenumurl-"; _strBuilder.Append("转到第<input id=\"nspagernum\" type=\"text\" data-url=\"" + _url.Action(actionName, controllerName, routeValues) + "\" />页"); _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " #nspagernum\").keydown(function (event) {if (event.keyCode == 13) location.href = $(\"#" + ctrlId + " #nspagernum\").attr(\"data-url\").replace(\"-nspagenumurl-\", $(\"#" + ctrlId + " #nspagernum\").val()); });</script>"); } _strBuilder.Append("</div>"); return MvcHtmlString.Create(_strBuilder.ToString()); }
PagerAjax跟Pager基本一样。不同点是在点击链接的时候Pager是转到相应页面,PagerAjax是在点击paer内的链接的时候利用jquery Post获取链接指定页面的html代码替换内容包裹容器的html。实际上就是这句jquery语句
复制代码 代码如下:<script type="text/javascript">$("#ctrlId a").click(function () {$.post($(this).attr("href"), function (data) {$("#ctnrId").html(data);});return false; });</script>
PagerAjax的整个内容
public static MvcHtmlString PagerAjax(this HtmlHelper htmlHelper, string ctnrId, string actionName, string controllerName, RouteValueDictionary routeValues, PagerConfig pageConfig, string ctrlId, string cssClass, int digitalLinkNum, bool showTotalRecord, bool showCurrentPage, bool showTotalPage, bool showSelect, bool showInput) { UrlHelper _url = new UrlHelper(htmlHelper.ViewContext.RequestContext); StringBuilder _strBuilder = new StringBuilder("<div id=\"" + ctrlId + "\" class=\"" + cssClass + "\">"); if (showTotalRecord) _strBuilder.Append("共" + pageConfig.TotalRecord + pageConfig.RecordUnit + pageConfig.RecordName + " "); if (showCurrentPage) _strBuilder.Append("每页" + pageConfig.PageSize + pageConfig.RecordUnit + " "); if (showTotalPage) _strBuilder.Append("第" + pageConfig.CurrentPage + "页/共" + pageConfig.TotalPage + "页 "); //首页链接 if (pageConfig.CurrentPage > 1) { routeValues["page"] = 1; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">首页</a>"); } else _strBuilder.Append("<span class=\"btn\">首页</span>"); //上一页 if (pageConfig.CurrentPage > 1) { routeValues["page"] = pageConfig.CurrentPage - 1; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">上一页</a>"); } else _strBuilder.Append("<span class=\"btn\">上一页</span>"); //数字导航开始 int _startPage, _endPage; //总页数少于要显示的页数,页码全部显示 if (digitalLinkNum >= pageConfig.TotalPage) { _startPage = 1; _endPage = pageConfig.TotalPage; } else//显示指定数量的页码 { int _forward = (int)Math.Ceiling(digitalLinkNum / 2.0); if (pageConfig.CurrentPage > _forward)//起始页码大于1 { _endPage = pageConfig.CurrentPage + digitalLinkNum - _forward; if (_endPage > pageConfig.TotalPage)//结束页码大于总页码结束页码为最后一页 { _startPage = pageConfig.TotalPage - digitalLinkNum; _endPage = pageConfig.TotalPage; } else _startPage = pageConfig.CurrentPage - _forward; } else//起始页码从1开始 { _startPage = 1; _endPage = digitalLinkNum; } } //向上… if (_startPage > 1) { routeValues["page"] = _startPage - 1; _strBuilder.Append("<a class=\"linkbatch\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">…</a>"); } //数字 for (int i = _startPage; i <= _endPage; i++) { if (i != pageConfig.CurrentPage) { routeValues["page"] = i; _strBuilder.Append("<a class=\"linknum\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">" + i.ToString() + "</a>"); } else { _strBuilder.Append("<span class='currentnum'>" + i.ToString() + "</span>"); } } //向下… if (_endPage < pageConfig.TotalPage) { routeValues["page"] = _endPage + 1; _strBuilder.Append("<a class=\"linkbatch\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">…</a>"); } ////数字导航结束 //下一页和尾页 if (pageConfig.CurrentPage < pageConfig.TotalPage) { routeValues["page"] = pageConfig.CurrentPage + 1; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">下一页</a>"); routeValues["page"] = pageConfig.TotalPage; _strBuilder.Append("<a class=\"linkbtn\" href=\"" + _url.Action(actionName, controllerName, routeValues) + "\">尾页</a>"); } else _strBuilder.Append("<span class=\"btn\">下一页</span><span class=\"btn\">尾页</span>"); //显示页码下拉框 if (showSelect) { routeValues["page"] = "-nspageselecturl-"; _strBuilder.Append(" 跳转到第<select id=\"nspagerselect\" data-url=\"" + _url.Action(actionName, controllerName, routeValues) + "\">"); for (int i = 1; i <= pageConfig.TotalPage; i++) { if (i == pageConfig.CurrentPage) _strBuilder.Append("<option selected=\"selected\" value=\"" + i + "\">" + i + "</option>"); else _strBuilder.Append("<option value=\"" + i + "\">" + i + "</option>"); } _strBuilder.Append("</select>页"); _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " #nspagerselect\").change(function () {$.post($(\"#" + ctrlId + " #nspagerselect\").attr(\"data-url\").replace(\"-nspageselecturl-\", $(\"#" + ctrlId + " #nspagerselect\").val()), function (data) {$(\"#" + ctnrId + "\").html(data);});});</script>"); } //显示页码输入框 if (showInput) { routeValues["page"] = "-nspagenumurl-"; _strBuilder.Append(" 转到第<input id=\"nspagernum\" type=\"text\" data-url=\"" + _url.Action(actionName, controllerName, routeValues) + "\" />页"); _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " #nspagernum\").keydown(function (event) {if (event.keyCode == 13) { $.post($(\"#" + ctrlId + " #nspagernum\").attr(\"data-url\").replace(\"-nspagenumurl-\", $(\"#" + ctrlId + " #nspagernum\").val()), function (data) {$(\"#" + ctnrId + "\").html(data);}); } });</script>"); } _strBuilder.Append("<script type=\"text/javascript\">$(\"#" + ctrlId + " a\").click(function () {$.post($(this).attr(\"href\"), function (data) {$(\"#" + ctnrId + "\").html(data);});return false; });</script>"); _strBuilder.Append("</div>"); return MvcHtmlString.Create(_strBuilder.ToString()); }
完工
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

