MVC HtmlHelper扩展——实现分页功能
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 ?? ;
}
set
{
_currentPage = value;
}
}
/// <summary>
/// 每页记录条数
/// </summary>
private static int? _pageSize = null;
/// <summary>
/// 每页记录条数
/// </summary>
public static int PageSize
{
get
{
return _pageSize ?? ;
}
set
{
_pageSize = value;
}
}
/// <summary>
/// 是否显示上一页
/// </summary>
public static bool HasPreviousPage
{
get
{
return (CurrentPage > );
}
}
/// <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/span
TagBuilder builder = new TagBuilder("div");//span
//创建Id,注意要先设置IdAttributeDotReplacement属性后再执行GenerateId方法.
//builder.IdAttributeDotReplacement = "_";
//builder.GenerateId(id);
//builder.AddCssClass("");
//builder.MergeAttributes(values);
builder.InnerHtml = PagingBuilder(values);
#endregion
return 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 = ; 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 {0} Records Page {1} of {2} ", TotalCount, CurrentPage, TotalPages);
#endregion
#region 首页 上一页
sb.AppendFormat(TagBuilder(values, , " First"));
//sb.AppendFormat("<a href={0}?page=1{1}>First</a> ",url,urlParameter);
if (HasPreviousPage)
{
sb.AppendFormat(TagBuilder(values, CurrentPage - , " Prev "));
//sb.AppendFormat("<a href={0}?page={1}{2}>Prev</a> ", url, CurrentPage - 1, urlParameter);
}
#endregion
#region 分页逻辑
if (TotalPages > )
{
if ((CurrentPage + ) < TotalPages)
{
if (CurrentPage > )
{
for (int i = CurrentPage - ; i <= CurrentPage + ; i++)
{
sb.Append(TagBuilder(values, i, i.ToString()));
}
}
else
{
for (int i = ; i <= ; i++)
{
sb.Append(TagBuilder(values, i, i.ToString()));
}
}
sb.Append("... ");
}
else
{
for (int i = CurrentPage - ; i <= TotalPages; i++)
{
sb.Append(TagBuilder(values, i, i.ToString()));
}
}
}
else
{
for (int i = ; i <= TotalPages; i++)
{
sb.Append(" " + TagBuilder(values, i, i.ToString()) + " ");
}
}
#endregion
#region 下一页 末页
if (HasNextPage)
{
sb.AppendFormat(TagBuilder(values, CurrentPage + , "Next"));
//sb.AppendFormat("<a href={0}?page={1}{2}>Next</a> ", url, CurrentPage + 1, urlParameter);
}
sb.AppendFormat(TagBuilder(values, TotalPages, "Last"));
//sb.AppendFormat("<a href={0}?page={1}{2}>Last</a>",url,TotalPages,urlParameter);
#endregion
return 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 + " ";
}
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 ?? ;
PagingHelper.CurrentPage = Convert.ToInt32(page);
PagingHelper.PageSize = ; //{获取数据集的中条数,以及分页的数据集} PagingHelper.TotalCount = ;
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>
最终效果图:

MVC HtmlHelper扩展——实现分页功能的更多相关文章
- .net mvc HtmlHelper扩展使用
如果是你是从webform开始接触.net,你应该记得webform开发中,存在自定义控件这东西,它使得我们开发起来十分方便,如今mvc大势所趋,其实在mvc开发时,也存在自定义控件这么个东西,那就是 ...
- ASP .NET MVC HtmlHelper扩展——简化“列表控件”的绑定
在众多表单元素中,有一类<select>元素用于绑定一组预定义列表.传统的ASP.NET Web Form中,它对应着一组重要的控件类型,即ListControl,我们经常用到DropDo ...
- [转]ASP.NET MVC HtmlHelper扩展之Calendar日期时间选择
本文转自:http://blog.bossma.cn/asp_net_mvc/asp-net-mvc-htmlhelper-calendar-datetime-select/ 这里我们扩展HtmlHe ...
- 【asp.net mvc】 扩展 htmlhelper 实现分页
参考文档:http://www.cnblogs.com/caofangsheng/p/5670071.html http://www.cnblogs.com/arte ...
- 扩展ASP.NET MVC HtmlHelper类
在这篇帖子中我会使用一个示例演示扩展ASP.NET MVC HtmlHelper类,让它们可以在你的MVC视图中工作.这个示例中我会提供一个简单的方案生成Html表格. HtmlHelper类 Htm ...
- MVC默认路由实现分页-PagerExtend.dll
这两天在群里有人咨询有没有现成的.net mvc分页方法,由此写了一个简单分页工具,这里简单分享下实现思路,代码,希望能对大家有些帮助,鼓励大家多造些轮子还是好的. A.效果(这里用了bootstra ...
- .net网站开发(前端):4.MVC HtmlHelper
通过前面三节,已经大概理解MVC是怎样运作的了.MVC的一个特点就是可以很方便地控制视图效果,数据交互也很灵活.先讲一下视图控制的,HtmlHelper,看到Help就知道它是不知疲惫的好人啦(有点像 ...
- JDBC使用数据库来完成分页功能
本篇讲诉如何在页面中通过操作数据库来完成数据显示的分页功能.当一个操作数据库进行查询的语句返回的结果集内容如果过多,那么内存极有可能溢出,所以在大数据的情况下分页是必须的.当然分页能通过很多种方式来实 ...
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...
随机推荐
- [读书笔记]-技术学习-Redis
1:Redis概览 Remote Dictionary Server 远程字典服务 Redis是基于内存的存储 在一台普通的笔记本上,Redis每秒的读取速度可以达到10万 内存读取数据,断电的时候数 ...
- 【sqli-labs】 less14 POST - Double Injection - Single quotes- String -twist (POST型单引号变形双注入)
名字和less13一样? 看了下源码对比 less13 less14 less14应该是双引号吧 出错 构造永真登陆
- express创建第一个web应用
Express 在初始化一个项目的时候需要指定模板引擎,默认支持Jade和ejs. 这里我们使用ejs模板引擎:(关于ejs的介绍可以先从百科里面了解一个大概)EJS是一个JavaScript模板库, ...
- shell脚本—基础知识,变量
shell脚本本质: 编译型语言 解释型语言 shell编程基本过程 1.建立shell文件 2.赋予shell文件执行权限,使用chmod命令修改权限 3.执行shell文件 shell变量: sh ...
- mongodb多实例部署
安装与管理MongoDB 1.安装解压源码包 [root@bogon ~]# tar xf mongodb-linux-x86_64-rhel70-4.0.6.tgz [root@bogon ~]# ...
- HDU 2268 How To Use The Car (数学题)
题目 //做起来很艰辛,总结起来很简单... //注意步行速度可能比车的速度快.... //推公式要仔细,,,, //一道对我来说很搞脑子的数学题,,,,, //车先送第一个人上路,第二个人步行:中途 ...
- Ubuntu安装RTX2080显卡驱动
安装RTX2080显卡驱动 近日新购了一台DELL服务器,用于TensorFlow,由于显卡是另加的,需要安装显卡驱动. 服务器配置 服务器型号:DELL PowerEdge R730 CPU:2*I ...
- 使用for或while循环来处理处理不确定页数的网页数据爬取
本文转载自以下网站: Python For 和 While 循环爬取不确定页数的网页 https://www.makcyun.top/web_scraping_withpython16.html 需 ...
- 2.2 SVN的简单使用
1.打开SVN服务器 选中Repositories→右键→Create new Repositories 选中Test2→右键→Copy URL to Clipboard 打开记事本粘贴地址:http ...
- POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)
手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn.net/suncongbo/article/details/79382991 题目链接: (p ...