以前在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. Tomcat安装后启动一闪而过

    出现这种问题一般是环境变量没配置好.除了JDK环境变量还有Tomcat环境变量:CATALINA_HOME 和CATALINA_BASE 虽然JDK里面会含有JRE,但是最好是在环境变量里面也配置一个 ...

  2. Ossim应用体验视频

    Ossim体验视频 近期,我写的有关Ossim应用的系列文章网友们非常关注,这里对大家提出有一些问题我制作了高清的视频和截图发布到网站,以让更多的人了解这款开源安全平台.在年后出版的教程中会详细讲解o ...

  3. vps选择

    banwagonhost.com digitalocean.com vultr.com 优惠链接 https://www.vultr.com/freetrial

  4. 【python】基础

    [字符串]前后引号必须要匹配,相关函数int(),float(),str(),repr(),format(),还有切片运算符 a = 'text'           单引号指定的字符串必须在一个逻辑 ...

  5. select,poll,epoll的归纳总结区分

    Select.Poll与Epoll比较 以下资料都是来自网上搜集整理.引用源详见文章末尾. 1 Select.Poll与Epoll简介 Select select本质上是通过设置或者检查存放fd标志位 ...

  6. pcap文件格式及文件解析

    第一部分:PCAP包文件格式 一 基本格式: 文件头 数据包头数据报数据包头数据报...... 二.文件头: 文件头结构体 sturct pcap_file_header {      DWORD   ...

  7. Volume serial number could associate file existence on certain volume

    When it comes to lnk file analysis, we should put more emphasis on the volume serial number. It coul ...

  8. css初涉

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Nginx 下无法读取session 导致 thinkphp验证码错误

    打开php配置文件 php.ini 使用搜索命令 whereis php.ini 一般在:/etc/php.ini 目录下 使用vim命令打开 找到: session.save_path 找到php保 ...

  10. openssl mac中使用终端生成RSA私钥和公钥文件

    RSA密钥生成命令生成RSA私钥openssl>genrsa -out rsa_private_key.pem 1024生成RSA公钥openssl>rsa -in rsa_private ...