MVC默认路由实现分页-PagerExtend.dll

这两天在群里有人咨询有没有现成的.net mvc分页方法,由此写了一个简单分页工具,这里简单分享下实现思路,代码,希望能对大家有些帮助,鼓励大家多造些轮子还是好的。

A.效果(这里用了bootstrap的样式)

B.分析,知识点

  a.分页通常由一下几个属性组成(当前页,总条数,分页记录数,路由地址),由此四项基本就能实现分页了,在加上一个控制样式的参数

  b.各种数字的验证,计算总页数(如果总条数和分页记录数不能整除,那么最后相除的结果再+1)

  c.下一页和上一下的按钮是零界点,需要判断是否是最后一页或者第一页来显示当前页数的继续增加或者减小

  d.因为需要在cshtml文件中展示分页的效果,所以需要用到HtmlHelper扩展方法;扩展方法这里简单说下注意项:

    .关键词this

    .扩展方法对应的clas必须静态,该方法本身也是静态

    .扩展方法对应的class后缀一般是Extensions修饰

  e.试图页面@Html.PageExtend直接调用分页方法

C.代码展示

  a.分页方法实现类

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 using System.Web.Mvc;
  7
  8 namespace PagerExtend
  9 {
 10     public static class HtmlHelperExtensions
 11     {
 12
 13         #region 分页扩展 PageExtend
 14
 15         /// <summary>
 16         /// 分页option属性
 17         /// </summary>
 18         public class MoPagerOption
 19         {
 20             /// <summary>
 21             /// 当前页  必传
 22             /// </summary>
 23             public int CurrentPage { get; set; }
 24             /// <summary>
 25             /// 总条数  必传
 26             /// </summary>
 27             public int Total { get; set; }
 28
 29             /// <summary>
 30             /// 分页记录数(每页条数 默认每页15条)
 31             /// </summary>
 32             public int PageSize { get; set; }
 33
 34             /// <summary>
 35             /// 路由地址(格式如:/Controller/Action) 默认自动获取
 36             /// </summary>
 37             public string RouteUrl { get; set; }
 38
 39             /// <summary>
 40             /// 样式 默认 bootstrap样式 1
 41             /// </summary>
 42             public int StyleNum { get; set; }
 43         }
 44
 45         /// <summary>
 46         /// 分页扩展方法
 47         /// </summary>
 48         /// <param name="helper">html试图</param>
 49         /// <param name="option">分页属性</param>
 50         /// <returns>html样式</returns>
 51         public static MvcHtmlString PageExtend(this HtmlHelper helper, MoPagerOption option)
 52         {
 53
 54             if (option.PageSize <= 0) { option.PageSize = 15; }
 55             if (option.CurrentPage <= 0) { option.CurrentPage = 1; }
 56             if (option.Total <= 0) { return MvcHtmlString.Empty; }
 57
 58             //总页数
 59             var totalPage = option.Total / option.PageSize + (option.Total % option.PageSize > 0 ? 1 : 0);
 60             if (totalPage <= 0) { return MvcHtmlString.Create("分页异常"); }
 61             //当前路由地址
 62             if (string.IsNullOrEmpty(option.RouteUrl))
 63             {
 64
 65                 option.RouteUrl = helper.ViewContext.HttpContext.Request.RawUrl;
 66                 if (!string.IsNullOrEmpty(option.RouteUrl))
 67                 {
 68
 69                     var lastIndex = option.RouteUrl.LastIndexOf("/");
 70                     option.RouteUrl = option.RouteUrl.Substring(0, lastIndex);
 71                 }
 72             }
 73             option.RouteUrl = option.RouteUrl.TrimEnd(‘/‘);
 74
 75             //构造分页样式
 76             var sbPage = new StringBuilder(string.Empty);
 77             switch (option.StyleNum)
 78             {
 79                 case 2:
 80                     {
 81                         break;
 82                     }
 83                 default:
 84                     {
 85                         #region 默认样式
 86
 87                         sbPage.Append("<nav>");
 88                         sbPage.Append("  <ul class=\"pagination\">");
 89                         sbPage.AppendFormat("       <li><a href=\"{0}/{1}\" aria-label=\"Previous\"><span aria-hidden=\"true\">&laquo;</span></a></li>",
 90                                                 option.RouteUrl,
 91                                                 option.CurrentPage - 1 <= 0 ? 1 : option.CurrentPage - 1);
 92
 93                         for (int i = 1; i <= totalPage; i++)
 94                         {
 95
 96                             sbPage.AppendFormat("       <li {1}><a href=\"{2}/{0}\">{0}</a></li>",
 97                                 i,
 98                                 i == option.CurrentPage ? "class=\"active\"" : "",
 99                                 option.RouteUrl);
100
101                         }
102
103                         sbPage.Append("       <li>");
104                         sbPage.AppendFormat("         <a href=\"{0}/{1}\" aria-label=\"Next\">",
105                                             option.RouteUrl,
106                                             option.CurrentPage + 1 > totalPage ? option.CurrentPage : option.CurrentPage + 1);
107                         sbPage.Append("               <span aria-hidden=\"true\">&raquo;</span>");
108                         sbPage.Append("         </a>");
109                         sbPage.Append("       </li>");
110                         sbPage.Append("   </ul>");
111                         sbPage.Append("</nav>");
112                         #endregion
113                     }
114                     break;
115             }
116
117
118             return MvcHtmlString.Create(sbPage.ToString());
119         }
120         #endregion
121     }
122 }

    b.View测试调用

 1 @using PagerExtend
 2 @model IEnumerable<XinSheng.Api.Controllers.MoAirticle>
 3
 4 <table>
 5     Url:@ViewBag.Url
 6
 7     @foreach (var item in Model)
 8     {
 9         <tr>
10             <td>@item.Title</td>
11             <td>@item.Author</td>
12             <td>@item.CreateTime</td>
13         </tr>
14     }
15 </table>
16
17 @Html.PageExtend(ViewBag.PagerOption as HtmlHelperExtensions.MoPagerOption)

    c.Controller测试

 1 using PagerExtend;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Web;
 6 using System.Web.Mvc;
 7 using System.Web.Security;
 8
 9 namespace XinSheng.Api.Controllers
10 {
11
12     [Serializable]
13     public class MoAirticle
14     {
15
16         public string Title { get; set; }
17         public string Author { get; set; }
18         public DateTime CreateTime { get; set; }
19     }
20
21     public class HomeController : Controller
22     {
23
24         public ActionResult Index(int id)
25         {
26             ViewBag.Title = "测试 分页";
27
28             List<MoAirticle> moAirticles = new List<MoAirticle>();
29
30             for (int i = 1; i < 50; i++)
31             {
32
33                 moAirticles.Add(new MoAirticle
34                 {
35                     Author = "神牛步行" + i,
36                     CreateTime = DateTime.Now,
37                     Title = "博客园之" + i
38                 });
39             }
40             ViewBag.Url = Request.RawUrl;
41
42             //初始化分页基础信息
43             var option = new HtmlHelperExtensions.MoPagerOption
44            {
45
46                CurrentPage = id,
47                PageSize = 15,
48                Total = moAirticles.Count
49            };
50             //动态传递分页属性
51             ViewBag.PagerOption = option;
52
53             var articles = moAirticles.Skip((option.CurrentPage - 1) * option.PageSize).Take(option.PageSize).ToList();
54             return View(articles);
55         }
56     }
57 }

  D.分页PagerExtend.dll下载地址

  PagerExtend.rar

  

时间: 2024-10-27 07:03:10

MVC默认路由实现分页-PagerExtend.dll的相关文章

mvc默认路由说明

一.命名参数规范+匿名对象 routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); 构造路由然后添加 Route myRoute = new Route("{contr

关于采用MVC开发默认路由导致首页部分文件访问失效的临时解决方案

最近开发中涉及了Mvc4的开发,其中的默认路由功能是很不错的东西,但是在实际应用中就出现了不少的问题.比如我们访问某网站http://www.abc.com,虽然路由会帮助自动转向Home/Index目录,但是浏览器的地址并没有变化,这个时候问题就出现了.如果你还有相对站点的还有其它子目录的时候,或者该mvc应用是放在虚拟目录中执行的时候,就会出现页面中设置"../某子目录名/文件名"无法访问的情况.只有当你在地址栏完整的输入路径,如:http://www.abc.com/Home/I

ASP.NET MVC之路由深究

MVC的强大之处之一当然是路由,这是几年前一位牛人给我说过的话,本人深感认同.今天就再次探究. 首先新建一个空的MVC项目,我们会发现在RouteConfig类中存在一个默认的路由配置,通常我会在这里的路由中添加一个命名空间,以防止路由配置冲突 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home&quo

asp.net MVC 5 路由 Routing

ASP.NET MVC ,一个适用于WEB应用程序的经典模型 model-view-controller 模式.相对于web forms一个单一的整块,asp.net mvc是由连接在一起的各种代码层所组成. 最近又接触了关于asp.net mvc的项目,又重拾以前的记忆,感觉忘了好多,特此记录. 首先,来说说路由Routing. ASP.NET MVC 不再是要依赖于物理页面了,你可以使用自己的语法自定义URL,通过这些语法来指定资源和操作.语法通过URL模式集合表达,也称为路由. 路由是代表

MVC中路由的修改和浏览器的地址参数

在 ASP.NET MVC 应用程序中,它是更常见的做法在作为路由数据 (像我们一样与身份证上面) 比将它们作为查询字符串传递的参数中传递. public string Welcome(string name, int ID = 1) { return HttpUtility.HtmlEncode("Hello " + name + ", ID: " + ID); } 您也可以添加一条路线来传递name 和 numtimes 作为路由数据的 URL 中的参数.在Ap

MVC的路由机制

MVC的默认路由可以在Global.asax.cs文件的RegisterRoutes方法中设置,其结构非常的简单易用,可以匹配各种形式, 路由配置可以由三个部分组成,最常见的就是{controller}/{action}/{id},只要这三个部分不连续出现,有间隔符,那么都可以匹配, 比如可以是{controller}-{action}-{id}, 也可以是{controller}·{action}·{id}, 喜欢的话还可以添加各种奇怪的东西,比如 lalal/{controller}·{ac

mvc url路由参数的加密和解密

查看某个信息的时候一般会在url上加上该信息在数据库中对应的主键id(而且一般是自增的) url是这样子的 xxxDetail/1 , 虽然对于我们开发人员来说可以这种显式的数据库主键会方便调试过程,但是这种url的安全性比较低 所以想将这类id给加密了, 当然也不想在需要此处理的地方 添加上加密或解密的代码; 基于mvc的路由机制我们可以很方便的将 输出的url和输入的url参数进行自动的加密和解密: 一.通过扩展UrlHelper方法, 对参数进行加密 1 public static cla

[学习笔记] 理解ASP.NET MVC的路由系统

引言 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请求URL最终被传递给特定Controller的特定Action进行处理.而在相反的方向上,MVC框架的渲染器同样要利用这张路由表,生成最终的HTML页面并返回URL.所以,理解整个ASP.NET MVC的路由系统,有两个必须出现的关键元素:Controller与Action,有两个方向的操作:传入的

[Spring MVC] - 地址路由使用(一)

常用的一些Spring MVC的路由写法以及参数传递方式. 参考引用: http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/mvc.html 这是一些测试例子: package com.my.controller; import java.io.PrintWriter; import java.util.Date; import javax.servlet.http.HttpServletRequest;