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#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...
随机推荐
- POJ_2411_Mondriaan's Dream_状态压缩dp
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 15407 Accepted: 888 ...
- HTML5 video常用属性
一.视频video常用标签方法 <!-- controls 控制条,播放暂停等 controlslist 控制不允许全屏 不允许下载等 poster 封面 autoplay 自动播放 muted ...
- mysql与oracle 表字段定义比较
链接: https://blog.csdn.net/yzsind/article/details/7948226
- html第三节课
表单 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...
- mysql如何删除数据库指定ID段的数据库。比如删除id 1-500的数据。
delete from tablename where id>=1 and id<=500或者DELETE FROM `数据库名称`.`数据表名称` WHERE `house_cs`.`i ...
- 支付宝h5支付从支付到退款
先说明,支付是之前写好的,调用的是支付宝旧的即时到账接口,所也没有去集成应用,退款调用的是无密即时到账退款接口!!! https://doc.open.alipay.com/支付宝文档资料,蚂蚁金服开 ...
- Future和Callable的使用
应用场景 财务成本核算.可能会有多个耗时的步骤.如果顺序执行是非常慢的.再相互数据获取数据不依赖的情况下可以使用Future并行执行 public class FutureTest implement ...
- Struts 获取表单数据总结
第一种:定义属性值,通过Setters方法获取 /** * 属性驱动:没有实体 * 要求:成员变量必须要有set方法,set后面的名称必须和表单中参数的属性名称一致(首字母大写) * 执行过程:通过成 ...
- 线上MySQL慢查询现象案例--Impossible WHERE noticed after reading const tables
前言:2012年的笔记整理而得,发布个人博客,做备忘录使用. 背景:线上慢查询日志监控,得到如下的语句: 发现:select doc_text from t_wiki_doc_text w ...
- DJANGO里让用户自助修改邮箱地址
因为在部署过程中会涉及用户邮件发送,如果有的同事不愿意收到太多邮件,则可以自己定义为不存在的邮箱. 我们在注册的时候,也不会写用户邮箱地址,那么他们也可以在这里自己更改. changeemail.ht ...