以前在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. WPF学习系列之八(形状,画刷和变换)

    形状,画刷和变换   概述: 在许多用户界面技术中,普通控件和自定义绘图之间具有清晰的区别.通常来说,绘图特性只用于特定的应用程序--如游戏,数据可视化和物理仿真等.而WPF具有一个非常不同的原则.它 ...

  2. 理解python先编译后解释的特点

    1. CPython默认的标准解释器编译器.JPython支持Java集成,可以生成Java字节码并在JVM中解释执行.IronPython支持.NET集成. 2. 下次运行程序时,python自动检 ...

  3. CSS常用的属性命名

    页头:header   如:#header{属性:属性值;}或.header{属性:属性值;},也许你需要了解class与id区别及用法 登录条:loginBar         标志:logo   ...

  4. leetcode 14

    14. Longest Common Prefix Write a function to find the longest common prefix string amongst an array ...

  5. Android代码写View

    1.Java Code package com.fish.helloworld; import android.app.Activity; import android.content.Context ...

  6. GUI_DOWNLOAD参数说明

    对FUNCTION: GUI_DOWNLOAD中某些参数的用法.       call function 'GUI_DOWNLOAD'     exporting *     BIN_FILESIZE ...

  7. nodejs前端自动化构建

    http://99jty.com/?p=1257 http://www.jankerli.com/?p=1628 http://www.cnblogs.com/zhepama/archive/2013 ...

  8. POJ C程序设计进阶 编程题#3:运算符判定

    编程题#3:运算符判定 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 两个 ...

  9. asp.net跨页面传值

    a.aspx.cs //获取a中的id HttpCookie objCookie = new HttpCookie("myCookie", id); Response.Cookie ...

  10. jquery easyui combobox

    $("#select_Dic").combobox({                        url: "http://www.cnblogs.com/Ajax/ ...