这两天在群里有人咨询有没有现成的.net mvc分页方法,由此写了一个简单分页工具,这里简单分享下实现思路,代码,希望能对大家有些帮助,鼓励大家多造些*还是好的。
A.效果(这里用了bootstrap的样式)
B.分析,知识点
a.分页通常由一下几个属性组成(当前页,总条数,分页记录数,路由地址),由此四项基本就能实现分页了,在加上一个控制样式的参数
b.各种数字的验证,计算总页数(如果总条数和分页记录数不能整除,那么最后相除的结果再+1)
c.下一页和上一下的按钮是零界点,需要判断是否是最后一页或者第一页来显示当前页数的继续增加或者减小
d.因为需要在cshtml文件中展示分页的效果,所以需要用到HtmlHelper扩展方法;扩展方法这里简单说下注意项:
.关键词this
.扩展方法对应的clas必须静态,该方法本身也是静态
.扩展方法对应的class后缀一般是Extensions修饰
e.试图页面@Html.PageExtend直接调用分页方法
C.代码展示
a.分页方法实现类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Mvc; namespace PagerExtend
{
public static class HtmlHelperExtensions
{ #region 分页扩展 PageExtend /// <summary>
/// 分页option属性
/// </summary>
public class MoPagerOption
{
/// <summary>
/// 当前页 必传
/// </summary>
public int CurrentPage { get; set; }
/// <summary>
/// 总条数 必传
/// </summary>
public int Total { get; set; } /// <summary>
/// 分页记录数(每页条数 默认每页15条)
/// </summary>
public int PageSize { get; set; } /// <summary>
/// 路由地址(格式如:/Controller/Action) 默认自动获取
/// </summary>
public string RouteUrl { get; set; } /// <summary>
/// 样式 默认 bootstrap样式 1
/// </summary>
public int StyleNum { get; set; }
} /// <summary>
/// 分页扩展方法
/// </summary>
/// <param name="helper">html试图</param>
/// <param name="option">分页属性</param>
/// <returns>html样式</returns>
public static MvcHtmlString PageExtend(this HtmlHelper helper, MoPagerOption option)
{ if (option.PageSize <= ) { option.PageSize = ; }
if (option.CurrentPage <= ) { option.CurrentPage = ; }
if (option.Total <= ) { return MvcHtmlString.Empty; } //总页数
var totalPage = option.Total / option.PageSize + (option.Total % option.PageSize > ? : );
if (totalPage <= ) { return MvcHtmlString.Create("分页异常"); }
//当前路由地址
if (string.IsNullOrEmpty(option.RouteUrl))
{ option.RouteUrl = helper.ViewContext.HttpContext.Request.RawUrl;
if (!string.IsNullOrEmpty(option.RouteUrl))
{ var lastIndex = option.RouteUrl.LastIndexOf("/");
option.RouteUrl = option.RouteUrl.Substring(, lastIndex);
}
}
option.RouteUrl = option.RouteUrl.TrimEnd('/'); //构造分页样式
var sbPage = new StringBuilder(string.Empty);
switch (option.StyleNum)
{
case :
{
break;
}
default:
{
#region 默认样式 sbPage.Append("<nav>");
sbPage.Append(" <ul class=\"pagination\">");
sbPage.AppendFormat(" <li><a href=\"{0}/{1}\" aria-label=\"Previous\"><span aria-hidden=\"true\">«</span></a></li>",
option.RouteUrl,
option.CurrentPage - <= ? : option.CurrentPage - ); for (int i = ; i <= totalPage; i++)
{ sbPage.AppendFormat(" <li {1}><a href=\"{2}/{0}\">{0}</a></li>",
i,
i == option.CurrentPage ? "class=\"active\"" : "",
option.RouteUrl); } sbPage.Append(" <li>");
sbPage.AppendFormat(" <a href=\"{0}/{1}\" aria-label=\"Next\">",
option.RouteUrl,
option.CurrentPage + > totalPage ? option.CurrentPage : option.CurrentPage + );
sbPage.Append(" <span aria-hidden=\"true\">»</span>");
sbPage.Append(" </a>");
sbPage.Append(" </li>");
sbPage.Append(" </ul>");
sbPage.Append("</nav>");
#endregion
}
break;
} return MvcHtmlString.Create(sbPage.ToString());
}
#endregion
}
}
b.View测试调用
@using PagerExtend
@model IEnumerable<XinSheng.Api.Controllers.MoAirticle> <table>
Url:@ViewBag.Url @foreach (var item in Model)
{
<tr>
<td>@item.Title</td>
<td>@item.Author</td>
<td>@item.CreateTime</td>
</tr>
}
</table> @Html.PageExtend(ViewBag.PagerOption as HtmlHelperExtensions.MoPagerOption)
c.Controller测试
using PagerExtend;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security; namespace XinSheng.Api.Controllers
{ [Serializable]
public class MoAirticle
{ public string Title { get; set; }
public string Author { get; set; }
public DateTime CreateTime { get; set; }
} public class HomeController : Controller
{ public ActionResult Index(int id)
{
ViewBag.Title = "测试 分页"; List<MoAirticle> moAirticles = new List<MoAirticle>(); for (int i = ; i < ; i++)
{ moAirticles.Add(new MoAirticle
{
Author = "神牛步行" + i,
CreateTime = DateTime.Now,
Title = "博客园之" + i
});
}
ViewBag.Url = Request.RawUrl; //初始化分页基础信息
var option = new HtmlHelperExtensions.MoPagerOption
{ CurrentPage = id,
PageSize = ,
Total = moAirticles.Count
};
//动态传递分页属性
ViewBag.PagerOption = option; var articles = moAirticles.Skip((option.CurrentPage - ) * option.PageSize).Take(option.PageSize).ToList();
return View(articles);
}
}
}
D.分页PagerExtend.dll下载地址
MVC默认路由实现分页-PagerExtend.dll的更多相关文章
-
MVC 默认路由 Areas
1.使用重名controller 在asp.net mvc2以后的版本里面,有了area(区域的概念),这为我们开发中提供了不少方便的地方,但是很不凑巧,若是存在多个重名的controller就会发生 ...
-
一:(1.1)了解MVC之路由重写
Mvc默认路由 //系统的Url路由规则 routes.MapRoute( name: "Default", url: "{controller}/{action}/{i ...
-
关于采用MVC开发默认路由导致首页部分文件访问失效的临时解决方案
最近开发中涉及了Mvc4的开发,其中的默认路由功能是很不错的东西,但是在实际应用中就出现了不少的问题.比如我们访问某网站http://www.abc.com,虽然路由会帮助自动转向Home/Index ...
-
ASP.NET MVC的路由
好久没写博文了,感觉最近好像少了点动力.唉!这回就看看这个MVC的路由. 说这个路由机制其实不是MVC里面特有的,ASP.NET里面本身就有的,只不过在WebForm里面一般比较少用,而在MVC里就是 ...
-
返璞归真 asp.net mvc (2) - 路由(System.Web.Routing)
原文:返璞归真 asp.net mvc (2) - 路由(System.Web.Routing) [索引页] [源码下载] 返璞归真 asp.net mvc (2) - 路由(System.Web.R ...
-
MVC中路由
篇目 介绍 路线的性质 了解缺省路由 用一个例子的路由 结论 介绍 本文介绍了MVC中的路由.如何执行的路线是由路由引擎和如何定义的URL路由. ASP.NET MVC的路由是一个模式匹配系统,负责传 ...
-
ASP.NET MVC之路由深究
MVC的强大之处之一当然是路由,这是几年前一位牛人给我说过的话,本人深感认同.今天就再次探究. 首先新建一个空的MVC项目,我们会发现在RouteConfig类中存在一个默认的路由配置,通常我会在这里 ...
-
MVC网址路由与生命周期
这篇写得比较详细,所以我收藏一下. 转载自: http://www.cnblogs.com/Eleanore/archive/2012/11/23/2783061.html 一.网址路由 1.1 比 ...
-
[Spring MVC] - 地址路由使用(一)
常用的一些Spring MVC的路由写法以及参数传递方式. 参考引用: http://docs.spring.io/spring/docs/3.0.x/spring-framework-referen ...
随机推荐
-
关于a标签自身的click事件所带来的一些影响
众所周知a标签自身带有点击事件<a href="#"></a>从它本身的特性来讲并没有什么不好的影响,但是如果你在a标签里又加入onclick事件则< ...
-
Codeforces Round #323 (Div. 2) C.GCD Table
C. GCD Table The GCD table G of size n × n for an array of positive integers a of length n is define ...
-
poj 2109 Power of Cryptography
点击打开链接 Power of Cryptography Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16388 Ac ...
-
Makefiles 介绍
http://www-personal.umich.edu/~ppannuto/writings/makefiles.html Makefiles Makefiles (or, the GNU aut ...
-
流媒体:V4L2视频获取
从深圳回来已经20多天了,除了完善毕业设计程序和论文,其他时间都去玩游戏了.真的是最后的一段时间能够无忧无虑在校园里挥霍自己的青春了.今天完成的答辩,比想象的要简单,一直以来想把我现在的这个流媒体的东 ...
-
List集合分页显示
package com.mshc.util; import java.util.Arrays; import java.util.Collections; import java.util.List; ...
-
nopCommerce 3.9 大波浪系列 之 路由注册
在Global.asax,Application_Start()方法中会进行路由注册,代码如下. public static void RegisterRoutes(RouteCollection r ...
-
JSP获取input(含正则表达式)
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> < ...
-
练习 HashSet 去重复
package com.rf.xs.list; import java.util.HashSet; public class Person { private String name; private ...
-
Java SE之Java工作原理
在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器.这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口.编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后 ...