MVC HtmlHelper扩展类(PagingHelper)

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;namespace HtmlHelperMvc.Models
{/// <summary>/// 分页类如果一个页面显示两个列表只需要复制该类到项目中重命名一个就可以/// </summary>public static class PagingHelper{#region 属性Property/// <summary>/// 当前页码/// </summary>private static int? _currentPage = null;/// <summary>/// 当前页码/// </summary>public static int CurrentPage{get{return _currentPage ?? 1;}set{_currentPage = value;}}/// <summary>/// 每页记录条数/// </summary>private static int? _pageSize = null;/// <summary>/// 每页记录条数/// </summary>public static int PageSize{get{return _pageSize ?? 15;}set{_pageSize = value;}}/// <summary>/// 是否显示上一页/// </summary>public static bool HasPreviousPage{get{return (CurrentPage > 1);}}/// <summary>/// 是否显示下一页/// </summary>public static bool HasNextPage{get{return (CurrentPage < TotalPages);}}/// <summary>/// 当前页:/// </summary>public static string CurrentPageDisplayName { get; set; }/// <summary>/// 每页显示:/// </summary>public static string PageSizeDisplayName { get; set; }public static string FirstDisplayName { get; set; }public static string PreDisplayName { get; set; }public static string NextDisplayName { get; set; }public static string LastDisplayName { get; set; }public static string TotalCountDisplayName { get; set; }public static string TotalPagesDisplayName { get; set; }/// <summary>/// 总条数/// </summary>public static int TotalCount{get;set;}public static int TotalPages{get{return (int)Math.Ceiling(TotalCount / (double)PageSize);//return (TotalCount % PageSize == 0 ? TotalCount / PageSize : TotalCount / PageSize + 1);
            }}/// <summary>/// 设置分页url eg:/Admin/Product/Index/// </summary>public static string PagingUrl{get;set;}/// <summary>/// 默认page,设置分页参数名 eg:/Admin/Product/Index?PagingParamName=1/// </summary>public static string PagingParamName{get;set;}#endregion#region Paging String/// <summary>/// MVC分页 如果用jquery分页只需要class不需要href,用以下实现:/// $(".class值").live("click", function () {/// var page = $(this).attr("pagingParamName值");/// $("#order").html("").load("/Customer/Order?page="+page);/// });live自动给遍历增加事件/// </summary>/// <param name="html"></param>/// <param name="htmlAttributes">new {@class="grey",pagingParamName="page",href="/Admin/Product/Index"} pagingParamName默认page,匿名类添加控件属性</param>/// <returns></returns>public static MvcHtmlString Paging(this System.Web.Mvc.HtmlHelper html, object htmlAttributes){RouteValueDictionary values = new RouteValueDictionary(htmlAttributes);#region 属性赋值if (values["href"] != null){PagingUrl = values["href"].ToString();}if (values["pagingParamName"] != null){PagingParamName = values["pagingParamName"].ToString();values.Remove("pagingParamName");}else{PagingParamName = "page";}#endregion#region 分页最外层div/spanTagBuilder builder = new TagBuilder("div");//span//创建Id,注意要先设置IdAttributeDotReplacement属性后再执行GenerateId方法. //builder.IdAttributeDotReplacement = "_";//builder.GenerateId(id);//builder.AddCssClass("");//builder.MergeAttributes(values);builder.InnerHtml = PagingBuilder(values);#endregionreturn MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal));//解决直接显示html标记
        }private static string PagingBuilder(RouteValueDictionary values){#region 条件搜索时包括其他参数StringBuilder urlParameter = new StringBuilder();NameValueCollection collection = HttpContext.Current.Request.QueryString;string[] keys = collection.AllKeys;for (int i = 0; i < keys.Length; i++){if (keys[i].ToLower() != "page"){urlParameter.AppendFormat("&{0}={1}", keys[i], collection[keys[i]]);}}#endregion//CurrentPage = Convert.ToInt32(HttpContext.Current.Request.QueryString["page"] ?? "0");StringBuilder sb = new StringBuilder();#region 分页统计sb.AppendFormat("Total &nbsp;{0} &nbsp; Records Page &nbsp;{1} of &nbsp;{2}  &nbsp; ", TotalCount, CurrentPage, TotalPages);#endregion#region 首页 上一页sb.AppendFormat(TagBuilder(values, 1, " First"));//sb.AppendFormat("<a href={0}?page=1{1}>First</a>&nbsp;",url,urlParameter);if (HasPreviousPage){sb.AppendFormat(TagBuilder(values, CurrentPage - 1, "   Prev   "));//sb.AppendFormat("<a href={0}?page={1}{2}>Prev</a>&nbsp;", url, CurrentPage - 1, urlParameter);
            }#endregion#region 分页逻辑if (TotalPages > 10){if ((CurrentPage + 5) < TotalPages){if (CurrentPage > 5){for (int i = CurrentPage - 5; i <= CurrentPage + 5; i++){sb.Append(TagBuilder(values, i, i.ToString()));}}else{for (int i = 1; i <= 10; i++){sb.Append(TagBuilder(values, i, i.ToString()));}}sb.Append("...&nbsp;");}else{for (int i = CurrentPage - 10; i <= TotalPages; i++){sb.Append(TagBuilder(values, i, i.ToString()));}}}else{for (int i = 1; i <= TotalPages; i++){sb.Append("&nbsp;" + TagBuilder(values, i, i.ToString()) + "&nbsp");}}#endregion#region 下一页 末页if (HasNextPage){sb.AppendFormat(TagBuilder(values, CurrentPage + 1, "Next"));//sb.AppendFormat("<a href={0}?page={1}{2}>Next</a>&nbsp;", url, CurrentPage + 1, urlParameter);
            }sb.AppendFormat(TagBuilder(values, TotalPages, "Last"));//sb.AppendFormat("<a href={0}?page={1}{2}>Last</a>",url,TotalPages,urlParameter);#endregionreturn sb.ToString();}private static string TagBuilder(RouteValueDictionary values, int i, string innerText){values[PagingParamName] = i;TagBuilder tag = new TagBuilder("a");if (PagingUrl != null){values["href"] = PagingUrl + "?" + PagingParamName + "= " + i + "&nbsp;&nbsp;&nbsp;";}if (CurrentPage == i && innerText != " First" && innerText != " Last"){values["id"] = "on";}else{tag.Attributes["id"] = "";}tag.MergeAttributes(values);tag.SetInnerText(innerText);return tag.ToString();}#endregion}
}

后台Controller代码

//
// GET: /Home/public ActionResult Index(int? page)
{page = page ?? 1;PagingHelper.CurrentPage = Convert.ToInt32(page);PagingHelper.PageSize = 20;//{获取数据集的中条数,以及分页的数据集}
PagingHelper.TotalCount = 2000;return View();
}

前台页面代码

@{ViewBag.Title = "Index";
}
@using HtmlHelperMvc.Models;
<h2>Index</h2>
<hr />
<style type="text/css">#on{color: #FFF;background-color: #337AB7;border-color: #337AB7;}.pagination a{margin-right: 3px;padding: 5px 10px;font-size: 12px;text-decoration: none;background-color: #fff;border: 1px solid #ddd;cursor: pointer;display: inline-block;border-radius: 3px;}a{color: #337ab7;text-decoration: none;}a{background-color: transparent;}*{-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;}
</style>
<script src="~/Scripts/jquery-1.8.2.js"></script>
<script type="text/javascript">$(function () {$(".pagination .active").live("click", function () {$("#page").val($(this).attr("page"));$("#form_Submit").submit();});});
</script>
<form id="form_Submit" action="/Home/Index" method="post"><div class="fix"><div class="page"><div class="pagination pagination-sm pull-right" id="pageDiv" style="margin: 0px 0;"><input type="hidden" id="page" name="page" value="@PagingHelper.CurrentPage" />@Html.Paging(new { @class = "active" })</div></div></div>
</form>

最终效果图:

作者:长毛象
微博:http://weibo.com/5567742196/info
博客:http://www.cnblogs.com/xiangyisheng/
本文版权归作者和博客园共有,个人学习成果,请多多指教,欢迎转载,请保留原文链接

转载于:https://www.cnblogs.com/xiangyisheng/p/6814027.html

MVC HtmlHelper扩展——实现分页功能相关推荐

  1. [转]ASP.NET MVC HtmlHelper扩展之Calendar日期时间选择

    本文转自:http://blog.bossma.cn/asp_net_mvc/asp-net-mvc-htmlhelper-calendar-datetime-select/ 这里我们扩展HtmlHe ...

  2. (首页上一页下一页尾页 + 下拉框跳转)分页功能

    说在前头(本人用的是bootstrap +jQuery 和 struts2 +  MVC)不影响分页功能 制作一个分页功能: 效果如下: 由上图可知,此功能只适合页数不是特别多的情况下,页数多的时候, ...

  3. 为ASP.NET MVC扩展异步Action功能(下)

    本文分为上下两部分,您也可以从<Extend ASP.NET MVC for Asynchronous Action>获得全部内容. 执行Action方法 对于执行同步Action的Syn ...

  4. mybatis-generator 插件扩展,生成支持多种数据库的分页功能

    2019独角兽企业重金招聘Python工程师标准>>> 背景: 在使用mybatis的过程中,考虑到整合的框架在后期使用的过程中,有可能是需要兼容到多种数据库的,在这种前提条件下,完 ...

  5. [ASP.NET MVC]通过对HtmlHelper扩展简化“列表控件”的绑定

    在众多表单元素中,有一类<select>元素用于绑定一组预定义列表.传统的ASP.NET Web Form中,它对应着一组重要的控件类型,即ListControl,我们经常用到DropDo ...

  6. MVC框架实现分页功能

    导航 1.数据库 2.控制器 3.视图 1.数据库 USE [master] GO /****** Object: Database [RbacDB] Script Date: 2020/6/2 23 ...

  7. C# ASP.NET MVC HtmlHelper用法大全

    C# ASP.NET MVC HtmlHelper用法大全 (原文) HTML扩展类的所有方法都有2个参数: 以textbox为例子 public static string TextBox( thi ...

  8. kindeditor扩展粘贴截图功能修改图片上传路径并通过webapi上传图片到图片服务器...

    2019独角兽企业重金招聘Python工程师标准>>> kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了. 而kindeditor却对图片的处理不够理想. ...

  9. 转:mybatis - 分页功能

    本文转自http://www.cnblogs.com/jcli/archive/2011/08/09/2132222.html mybatis高级应用系列一:分页功能 Mybatis3.0出来已有段时 ...

最新文章

  1. Science:中科院植物所马克平组揭示土壤真菌与树木密度的关系
  2. 华为云交付项目服务器配置表,云端服务器配置表
  3. IDEA Scala自动生成变量类型设置教程
  4. u盘如何linux双系统,怎么用U盘在Windows7下再安装ubuntu形成双系统?
  5. 深入浅出MFC文档/视图架构之文档
  6. ajax 更新模型数据_DuangDuangDuang,重点来啦!高薪全靠它——百战Web前端课程更新03.11...
  7. Android Eclipse ADT使用Tips
  8. ubuntu 10.04的git安装和使用
  9. SqlConnection调用Dispose方法之后还可以在连接池中复用吗?
  10. UnityShader33:GPU 实例化
  11. flink的mysql两阶段提交_Flink 源码之两阶段提交
  12. MySQL第41题怎么评分_MySQL试题-测试、复习、查看
  13. 2019牛客暑期多校训练营(第九场) F Birthday Reminders(dp)
  14. 亲身实践,效果显著,让“轻断食”帮你打扫一下身体吧~
  15. 如何打造属于自己的专属武器库
  16. [流媒体]实例解析MMS流媒体协议,下载LiveMediaVideo[1][修正版,增加了带宽测试包]
  17. Python地理数据处理 十一:空间参照系统(SRS)
  18. Zabbix入门学习课程——Zabbix_Server安装篇
  19. 如何铸造游戏中的NFT游戏角色
  20. 判断一个用字符串表达的数字是否可以被整除

热门文章

  1. 对于初学者,如何轻松学习JavaScript?
  2. 关于TCP三次握手过程
  3. Linux地图投影Proj4应用,Proj.4简介与使用
  4. bp算法运行太慢_神经网络,BP算法的理解与推导
  5. java public_java中public,private,protected和default的区别
  6. 经典最优滤波器(概述)
  7. Unity打开的文件是杂项文件的处理方法
  8. 刷新tabpanel中的子项目内容
  9. 翻译:Hystrix - How To Use
  10. 从芯开始,解读华为云的全栈全场景与全球化布局