• MVC简单分页


    学习MVC分页,消化了一个别人的DEMO,基本上了解原理了。

    原理

     MVC分页,需要确定3个参数:

    1、每一页的记录数量

    2、当前的页码

    3、记录总数

    分页原理:

    1、确定每一页的记录数量参数和总记录数量,计算出一共多少页(为了避免少计算页码,需要考虑总页数四舍五入。比如一页5条记录,如果21条记录,就会有5页,而不是4页。)

    2、获得URL中的ID参数,确定当前页码

    3、获得数据源,根据当前页码计算需要从数据源中取出多少条记录

    4、生成分页条

    5、在页面中显示分页条

    代码

     第一部分pagerHelper用于获取分页参数,并提供生成分页条的方法。

    //分页的数据处理
        public class PageHelper
        {
            #region 数据
            public PagerHtml PageH;
            private int _pageSize,_totalCount, _currentPageIndex;
            /// <summary>
            /// 每页数据条数
            /// </summary>
            public int PageSize
            {
                get
                {
                    return _pageSize;
                }
                set
                {
                    if (value < 1) throw new ArgumentOutOfRangeException();
                    _pageSize = value;
    
                    CalcPage();
                }
            }
            /// <summary>
            /// 总页数
            /// </summary>
            public int PageCount { get; set; }
            
            /// <summary>
            /// 总条数
            /// </summary>
            public int TotalCount
            {
                get
                {
                    return _totalCount;
                }
                set
                {
                    _totalCount = value;
                    CalcPage();
                }
            }
           
            #endregion 数据
    
            #region 方法
            public PageHelper() { }
            /// <summary>
            /// 初始化
            /// </summary>
            /// <param name="pageSize">每页显示记录数量</param>
            /// <param name="currentPageIndex">页码</param>
            /// <param name="totalCount">记录总数</param>
            /// <param name="url">URL参数,用在HTML输出</param>
            public PageHelper(int pageSize, int currentPageIndex,int totalCount, string url)
            {
                this.PageSize = pageSize;
                this.CurrntPageIndex = currentPageIndex;
                this.TotalCount = totalCount;
                PageH = new PagerHtml(pageSize, currentPageIndex, totalCount, url, 8);
            }
            /// <summary>
            /// 当前页码
            /// </summary>
            public int CurrntPageIndex
            {
                get
                {
                    if (PageSize == 0 || PageCount == 0) return _currentPageIndex;
    
                    if (_currentPageIndex < 1) return 1;
                    else if (_currentPageIndex > PageCount) return PageCount;
                    else return _currentPageIndex;
                }
                set
                {
                    _currentPageIndex = value;
    
                    if (_currentPageIndex < 1) _currentPageIndex = 1;
                }
            }
            /// <summary>
            /// 获取分页数据HTML
            /// </summary>
            /// <returns></returns>
            public string GetStr()
            {
                return PageH.GetStrClub();
            }
            /// <summary>
            /// 重新计算当前页面总数
            /// </summary>
            void CalcPage()
            {
                if (_pageSize == 0) return;
    
                PageCount = (int)Math.Ceiling(TotalCount * 1.0 / PageSize);
            }
    
            /// <summary>
            /// 返回当前页的记录起始索引
            /// </summary>
            public int StartIndex
            {
                get
                {
                    return (_currentPageIndex - 1) * PageSize;
                }
            }
            #endregion 方法
        }


    第二部分的代码用于生成分页条。和看的DEMO不一样,这里链接的URL是手动输入的,在DEMO里面是利用正则将页面的URL直接进行处理。


    //
    分页栏的html输出 public class PagerHtml { #region 参数 public int PageSize { get; set; } public int CurrentPage { get; set; } public int RecordCount { get; set; } public int PageCount { get; set; } public string Url { get; set; } public int ExtendPage { get; set; } private string PageUnion { get; set; } #endregion 参数 #region 方法 /// <summary> /// 初始化 /// </summary> /// <param name="pagesize">页面尺寸</param> /// <param name="curPage">页码</param> /// <param name="recordCount">总数</param> /// <param name="url">网址</param> /// <param name="extendPage">显示的分页码数量</param> public PagerHtml(int pagesize, int curPage, int recordCount, string url, int extendPage) { PageUnion = ""; this.PageSize = pagesize; this.CurrentPage = curPage; this.RecordCount = recordCount; this.Url = url; this.ExtendPage = extendPage; PageCount = RecordCount % PageSize == 0 ? RecordCount / PageSize : (RecordCount / PageSize + 1);//避免少计算页码,这样比如一页5条记录,如果21条记录,就会有5页,而不是4页。 } /// <summary> /// 获取分页字符串 /// </summary> /// <returns></returns> public string GetStrClub() { //只有一页的情况 if (PageCount == 1 || RecordCount == 0) { return string.Empty; } int startPage = 1; int endPage = 1; int nextPage=CurrentPage + 1; int prePage=CurrentPage - 1; //格式化上一页,下一页链接 string t1 = "<a href=\"" + Url+"\\"+prePage.ToString()+ "\">上一页</a>&nbsp;"; string t2 = "<a href=\"" +Url+"\\"+nextPage.ToString()+ "\">下一页</a>"; if (PageCount < 1) PageCount = 1; if (ExtendPage < 3) ExtendPage = 2; if (PageCount > ExtendPage) { if (CurrentPage - (ExtendPage / 2) > 0) { if (CurrentPage + (ExtendPage / 2) < PageCount) { startPage = CurrentPage - (ExtendPage / 2); endPage = startPage + ExtendPage - 1; } else { endPage = PageCount; startPage = endPage - ExtendPage + 1; t2 = ""; } } else { endPage = ExtendPage; t1 = ""; } } else { startPage = 1; endPage = PageCount; t1 = ""; t2 = ""; } StringBuilder s = new StringBuilder(""); s.Append(t1); for (int i = startPage; i <= endPage; i++) { if (i == CurrentPage) { s.AppendFormat("{0}<div class=\"page_link\">", i); } else { s.AppendFormat("<a href=\"{0}\">{1}</a></div>",Url+"\\"+i.ToString(), i); } } s.Append(t2); return s.ToString(); } #endregion 方法 }


    对数据源进行处理,只取分页显示的部分记录。

    var q = value.AsQueryable<valModel>();
                if (currentPage > 0) q = q.Skip((currentPage - 1) * pageSize);
                pagingSource = q.Take(pageSize).ToList();

    model的完整代码:

    TestModel
        public class TestModel
        {
            public List<valModel> value;
            public List<valModel> pagingSource;//分页出来的数据
            public PageHelper pager;
            public TestModel(string id)
            {
                int pageSize = 10;
                int currentPage;
                if (string.IsNullOrEmpty(id))
                { 
                    currentPage = 1;
                }
                else
                {
                    currentPage = Convert.ToInt16(id);
                }
                value = new List<valModel>();
                //模拟数据源
                for (int i = 0; i < 1000; i++)
                {
                    valModel val = new valModel(i);
                    value.Add(val);
                }
    
    
                int totalCount = value.Count;
                //分页
                pagingSource = new List<valModel>();
                var q = value.AsQueryable<valModel>();
                if (currentPage > 0) q = q.Skip((currentPage - 1) * pageSize);
                pagingSource = q.Take(pageSize).ToList();
                pager = new PageHelper(pageSize, currentPage, totalCount, "/home/catalog");
            }
        }
    
        public class valModel
        { 
            public string Value{get;set;}
            public valModel(int i)
            {
                Value = i.ToString();
            }
        }


    在view中显示:

    TestView
        <% website.Models.TestModel tm = ViewData.Model as website.Models.TestModel;%>
        <%foreach (var item in tm.pagingSource)
          {
        %>
        <tr>
            <td>
                <%=item.Value %>
            </td>
        </tr>
        <%
          } %>
          <div style="clear:both"></div>
        <%= tm.pager.GetStr()%>

    contoler中的代码:

            public ActionResult test(string id)
            {
                //id传递页码
                Models.TestModel tm = new Models.TestModel(id);
                return View(tm);
            }

    注意

    1、这种不是ajax的

    2、分页条的样式是可调的,用CSS即可。如果需要更多风格(如带省略号等),可以在pagehtml里面加点判断逻辑然后添加。

    3、数据源是将所有记录全部取出后选择性的取其中一部分,如果数据量很大的话就很麻烦,其实也可以根据当前页和一页中的记录数量2个参数来即时取值,应该效果要好些。

  • 相关阅读:
    GetSystemMetrics SM_** 系统消息
    Direct3D中的HLSL
    Delphi TStream 详细介绍
    VI命令详解(大全)
    Delphi中messagedlg
    Windows中的消息详细列表
    SharePoint2007深入浅出——开发环境配置
    深入浅出InfoPath——预备式
    SharePoint术语对照表
    深入浅出Nintex——判断当前用户的角色
  • 原文地址:https://www.cnblogs.com/matoo/p/2768713.html
Copyright © 2020-2023  润新知