以前在ASP.NET WebForm开发中会用到许多控件,像DropDownList等。同样ASP.NET MVC中也有类似的控件-HtmlHelper。

HtmlHelper和服务器控件相比,HtmlHelper更灵活一些,而且扩展起来也更方便。实际开发中“分页”功能是必不可少的,于是我自定义了一个HtmlHelper的分页控件,总结出来,希望能帮助到大家。

HtmlHelper扩展方式有两种:

1.@helper

这种方式是使用Razor语法扩展。直接在cshtml中编写即可,非常直观。它有两种实现形式:

  • 直接在当前cshtml中编写,然后直接调用:
<h2>Demo</h2>
@helper MyButton(string name,string style){
//todo: 实现 }
<div>
@MyButton("呵呵","margin:3px 3px;") </div>
  • 在单独的cshtml中编写,在其他文件中调用,这个cshtml文件必须放在App_Code里面:
<h2>Demo1</h2>
<div>
@hHelpers.MyButton("哈哈","Color:red;")
</div>

2.扩展方法利用C#特性-扩展方法来实现扩展,本文将采用这种方式。废话不多说直接上代码。首先先定义一个PageViewData类,用于存储分页的相关信息

public class PageViewData<T>
{
/// <summary>
/// 当前页
/// </summary>
public int CurrentPage { get; set; } private readonly int _totalPageount;
/// <summary>
/// 总页数
/// </summary>
public int TotalPageCount
{
get
{
return _totalPageount;
}
} private int _totalDataCount;
/// <summary>
/// 数据源总量
/// </summary>
public int TotalDataCount
{
get { return _totalDataCount; }
set { _totalDataCount = value; }
} private int _pageSize;
/// <summary>
/// 每页显示数据大小
/// </summary>
public int PageSize
{
get { return _pageSize; }
set { _pageSize = value; }
} /// <summary>
/// 当前页数据列表
/// </summary>
public IList<T> Items { get; set; } public PageViewData()
{
} public PageViewData(int currentPage, int pageSize, int totalDataCount)
{
CurrentPage = currentPage;
_pageSize = pageSize;
_totalDataCount = totalDataCount;
_totalPageount = (int)Math.Ceiling(_totalDataCount * 1.0 / _pageSize);
} }

然后开始编写分页组件代码。

public static MvcHtmlString PagePanel<T>(this HtmlHelper html, PageViewData<T> pageViewData,
Func<int, string> action,
int showMaxPageCount = 10,
PagingMode mode = PagingMode.Plain)
{
if (showMaxPageCount <= 0)
{
return MvcHtmlString.Empty;
} StringBuilder sb = new StringBuilder(); sb.AppendFormat("<div id=\"kPaging\">");
if (pageViewData.TotalPageCount > 1)
{
if (mode == PagingMode.Detail)
{
sb.AppendFormat("<span style=\"margin:0px 5px;\">第 {0} 页,共{1}页,共{2}条</span>", pageViewData.TotalPageCount < pageViewData.CurrentPage ? 1 : pageViewData.CurrentPage,
pageViewData.TotalPageCount, pageViewData.TotalDataCount);
} int startPageNum, endPageNum; sb.AppendFormat(PageLinkTemplete, action(1), "首页");
if (pageViewData.CurrentPage > 1)
{
sb.AppendFormat(PageLinkTemplete, action(pageViewData.CurrentPage - 1), "上一页");
} //第一页
if (pageViewData.CurrentPage <= 1)
{
startPageNum = 1;
endPageNum = showMaxPageCount;
if (endPageNum > pageViewData.TotalPageCount)
{
endPageNum = pageViewData.TotalPageCount;
}
pageViewData.CurrentPage = 1;
}
else if (pageViewData.CurrentPage >= pageViewData.TotalPageCount)//最后一页
{
startPageNum = pageViewData.TotalPageCount - showMaxPageCount + 1;
endPageNum = pageViewData.TotalPageCount;
if (startPageNum <= 0)
{
startPageNum = 1;
}
pageViewData.CurrentPage = pageViewData.TotalPageCount;
}
else
{
//当前页区域
int regionIndex = 1;
regionIndex = (int)Math.Ceiling(pageViewData.CurrentPage * 1.0 / showMaxPageCount); startPageNum = (regionIndex - 1) * showMaxPageCount + 1;
endPageNum = regionIndex * showMaxPageCount; //TotalPageCount是否小于endPageNum
if (endPageNum > pageViewData.TotalPageCount)
{
endPageNum = pageViewData.TotalPageCount;
}
} for (int i = startPageNum; i <= endPageNum; i++)
{
if (i == pageViewData.CurrentPage)
{
sb.AppendFormat(CurrentPageLinkTemplete, i);
}
else
{
sb.AppendFormat(PageLinkTemplete, action(i), i);
}
} if (pageViewData.CurrentPage < pageViewData.TotalPageCount)
{
sb.AppendFormat(PageLinkTemplete, action(pageViewData.CurrentPage + 1), "下一页");
} sb.AppendFormat(PageLinkTemplete, action(pageViewData.TotalPageCount), "末页");
} sb.AppendFormat("</div>"); return MvcHtmlString.Create(sb.ToString());
}

最后调用

<style type="text/css">
#kPaging {
PADDING-RIGHT: 3px;
PADDING-LEFT: 3px;
FONT-SIZE: 0.85em;
PADDING-BOTTOM: 3px;
MARGIN: 3px;
PADDING-TOP: 3px;
FONT-FAMILY: Tahoma,Helvetica,sans-serif;
TEXT-ALIGN: center;
} #kPaging .currentPage {
PADDING-RIGHT: 6px;
PADDING-LEFT: 6px;
FONT-WEIGHT: bold;
PADDING-BOTTOM: 2px;
COLOR: #000;
MARGIN-RIGHT: 3px;
PADDING-TOP: 2px;
} #kPaging .pageLink {
BORDER-RIGHT: #ccdbe4 1px solid;
PADDING-RIGHT: 8px;
BACKGROUND-POSITION: 50% bottom;
BORDER-TOP: #ccdbe4 1px solid;
PADDING-LEFT: 8px;
PADDING-BOTTOM: 2px;
BORDER-LEFT: #ccdbe4 1px solid;
COLOR: #0061de;
MARGIN-RIGHT: 3px;
PADDING-TOP: 2px;
BORDER-BOTTOM: #ccdbe4 1px solid;
TEXT-DECORATION: none;
}
</style> <h2>title</h2>
@Html.PagePanel(new PageViewData<Student>(6, 10, 58), i => string.Format("#?page={0}", i), 10)

展示效果:

它的样式我们可以自定义,只要重写#kPaging、.pageLink、.currentPage选择器内容即可。

【ASP.NET MVC 回顾】HtmlHepler应用-分页组件的更多相关文章

  1. asp.net MVC 回顾 Html.ActionLink

    在asp.net MVc中想生成一个超链接有很多种方式,通过直接输入<a>.Html.ActionLink.Html.RouteLink等等,今天我们要阐述的就是Html.ActionLi ...

  2. asp.net mvc 的几种分页Pager

    第一种 /// <summary> /// 分页Pager显示 /// </summary> /// <param name="html">&l ...

  3. Asp.Net MVC结合ExtJs gridPanel 分页和高度自适应

    Ext.onReady(function () { gridPanel(); var panel = Ext.getCmp('gridPanel'); window.onresize = functi ...

  4. Asp.Net MVC EasyUI DataGrid查询分页

    function doSearch() { //查询方法 var searchValue = $('#txtQueryTC001').textbox('getText'); $('#dgCMSTC') ...

  5. asp.net mvc 简易通用自定义Pager实现分页

    asp.net mvc 自定义Pager实现分页 Intro 一个WEB应用程序中经常会用到数据分页,本文将实现一个简单通用的分页组件,包含一个 PagerModel (用来保存页码信息),一个 Ht ...

  6. ASP.NET MVC分页实现

    ASP.NET MVC中不能使用分页控件,所以我就自己写了一个分页局部视图,配合PageInfo类,即可实现在任何页面任意位置呈现分页,由于采用的是基于POST分页方式,所以唯一的限制就是必须放在FO ...

  7. 在 ASP.NET MVC 中充分利用 WebGrid (microsoft 官方示例)

    在 ASP.NET MVC 中充分利用 WebGrid https://msdn.microsoft.com/zh-cn/magazine/hh288075.aspx Stuart Leeks 下载代 ...

  8. 【jqGrid for ASP.NET MVC Documentation】.学习笔记.1.介绍

    1 介绍 jqGrid for ASP.NET MVC 是一个服务端组件. 专为MVC    分隔 model ,view , controller 的原则,完全观察者模式 非常快的速度    仅仅很 ...

  9. 为什么要坚持用ASP.NET MVC!(②)

    尽管ASP.NET MVC架构和Web Form架构区别很大,但是还是有很多共同之处.毕竟它们都是以ASP.NET API与.NET框架为基础构建的.比较一下ASP.NET MVC和Web Form框 ...

随机推荐

  1. ubuntu多网卡绑定

    这是最近碰到这个问题,需要将两张网卡绑定,共用一个IP,实现冗余效果.实际上linux双网卡的绑定模式有7中,而在这里常用的是 active-backup linux有七种网卡绑定模式:0. roun ...

  2. vyos (一) 基础配置

    http://www.lowefamily.com.au/2015/11/29/using-a-vyos-router-with-hyper-v/1/ http://thomasvochten.com ...

  3. PHP 按二维数组的键值排序

    /** * 按二维数组的键值排序 * @param unknown $array 二维数组 * @param unknown $key 二维数组的键值 * @param string $order 升 ...

  4. 在.NET2.0中解析Json和Xml

    在.NET解析json有很多方法,这里介绍最简单也用的最多的一种. 一.添加引用 解析Json,先下载开源控件 Newtonsoft.Json.dll 下载地址:http://files.cnblog ...

  5. 安装 centos7 注意事项

    最近一直没有写博客,把之前的折腾记录写下. 1 下载好镜像文件,刻录光盘. 2  用DVD安装CENTOS7 3 有些处理器不支持Cento7安装,需要重新编译内核文件.我不懂 . 我用的ACER  ...

  6. linux下source命令的基本功能

    source命令用法:source FileName作用:在当前bash环境下读取并执行FileName中的命令.注:该命令通常用命令“.”来替代.如:source .bash_rc 与 . .bas ...

  7. MongoDB 插入文档

    文档的数据结构和JSON基本一样. 所有存储在集合中的数据都是BSON格式. BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON. 插入文档 MongoDB 使用 inse ...

  8. Android中的显示单位

    px (pixels)像素 一般HVGA代表320x480像素,这个用的比较多. dip或dp (device independent pixels)设备独立像素 这个和设备硬件有关,一般为了支持WV ...

  9. ViewPage显示Fragment集合实现左右滑动并且出现tab栏--第三方开源--SlidingTabLayout和SlidingTabStrip实现

    注意:有关Fragment的方法和ViewPager的全部是android.support.v4包的,否则会报很多的错误 MainActivity: package com.zzw.fragmentt ...

  10. jQuery基础知识--选择器与效果

    $(this).hide()-----隐藏当前元素 $("p").hide()------隐藏所有段落 $(".test").hide()--隐藏所有class ...