ASP.NET MVC分页实现

ASP.NET MVC中不能使用分页控件,所以我就自己写了一个分页局部视图,配合PageInfo类,即可实现在任何页面任意位置呈现分页,由于采用的是基于POST分页方式,所以唯一的限制就是必须放在FORM中,当然以后我会考虑实现基于URL分页的!

一、PageInfo类

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5  
  6 namespace ROIS.Models
  7 {
  8     /// <summary>
  9     /// 分页信息
 10     /// </summary>
 11     public class PageInfo
 12     {
 13         private int _RecordCount = 0;
 14         private int _PageSize = 10;
 15         private int _CurrentPageNo=1;
 16  
 17         /// <summary>
 18         /// 获取或设置记录总数
 19         /// </summary>
 20         public int RecordCount
 21         {
 22             get
 23             {
 24                 return _RecordCount;
 25             }
 26             set
 27             {
 28                 if (value > 0)
 29                 {
 30                     _RecordCount = value;
 31                 }
 32             }
 33         }
 34  
 35         /// <summary>
 36         /// 获取或设置每页记录数
 37         /// </summary>
 38         public int PageSize
 39         {
 40             get {
 41                 return _PageSize;
 42             } 
 43             set {
 44                 if (value > 0)
 45                 {
 46                     _PageSize = value;
 47                 }
 48             }
 49         }
 50  
 51         /// <summary>
 52         /// 获取或设置当前索引页码(从1开始计算)
 53         /// </summary>
 54         public int CurrentPageNo
 55         {
 56             get {
 57                 return _CurrentPageNo;
 58             }
 59  
 60             set {
 61                 if (value > 0)
 62                 {
 63                     if (value > this.PageCount)
 64                     {
 65                         _CurrentPageNo = this.PageCount;
 66                     }
 67                     else
 68                     {
 69                         _CurrentPageNo = value;
 70                     }
 71                 }
 72             } 
 73         }
 74  
 75         /// <summary>
 76         /// 获取总页数
 77         /// </summary>
 78         public int PageCount
 79         {
 80             get
 81             {
 82                 if (this.RecordCount <= 0)
 83                 {
 84                     return 1;
 85                 }
 86  
 87                 return this.RecordCount / this.PageSize + (this.RecordCount % this.PageSize > 0 ? 1 : 0);
 88             }
 89         }
 90  
 91         public PageInfo()
 92         { }
 93  
 94         public PageInfo(int recordCount, int currentPageNo, int pageSize = 10)
 95         {
 96             this.RecordCount = recordCount;
 97             this.PageSize = pageSize;
 98             this.CurrentPageNo = currentPageNo;
 99         }
100  
101  
102         /// <summary>
103         /// 是否为首页
104         /// </summary>
105         /// <returns></returns>
106         public bool IsFirstPage()
107         {
108             return (this.CurrentPageNo <= 1);
109         }
110  
111  
112         /// <summary>
113         /// 是否为末页
114         /// </summary>
115         /// <returns></returns>
116         public bool IsLastPage()
117         {
118             return (this.CurrentPageNo>=this.PageCount);
119         }
120  
121     }
122 }
123  

 

二、_Pager局部视图(建议放在Shared目录下)

@using ROIS.Models;
 
@model PageInfo
 
@if (Model!=null && Model.RecordCount > 0)
{           
<div class="pager">
    第@(Model.CurrentPageNo) 页&nbsp;/&nbsp;共@(@Model.PageCount)页,
@if (Model.IsFirstPage())
{
    <span>|&lt;首&nbsp;&nbsp;页</span>
    <span>&lt;上一页</span>
}
else
{
    <a href="javascript:turnPage(1);">|&lt;首&nbsp;&nbsp;页</a>
    <a href="javascript:turnPage(@(Model.CurrentPageNo-1));">&lt;上一页</a>
}
@if (Model.IsLastPage())
{
    <span>下一页&gt;</span>
    <span>末&nbsp;&nbsp;页&gt;|</span>
}
else
{
     <a href="javascript:turnPage(@(Model.CurrentPageNo+1));">下一页&gt;</a>
     <a href="javascript:turnPage(@Model.PageCount);">末&nbsp;&nbsp;页&gt;|</a>
}
转到:
<select id="pages" onchange="javascript:turnPage(this.value);">
    @for (int i = 1; i <= Model.PageCount; i++)
    {
        if (Model.CurrentPageNo == i)
        {
        <option value="@i" selected="selected">第@(i)页</option>
        }
        else
        {
        <option value="@i">第@(i)页</option>
        }
    }
</select>
<input type="hidden" id="_pageno" name="_pageno" />
</div>
<script type="text/javascript">
<!--
    function turnPage(pageNo) {
        var oPageNo = document.getElementById("_pageno");
        oPageNo.value = pageNo;
        oPageNo.form.submit();
    }
 
    function getForm(obj) { //这个没有用到,但可以取代上面的oPageNo.form
        if (obj.parentNode.nodeName.toLowerCase() == "form") {
            return obj.parentNode;
        } else {
            getForm(obj.parentNode);
        }
    }
//-->
</script>
 
}

 

三、使用方法:

后台Controller的Action中加入:

            string pageNo = Request.Form["_pageno"];
            int iPageNo = 1;
            int.TryParse(pageNo, out iPageNo);
            PageInfo pageInfo=new PageInfo(5000,iPageNo, 20);

            ViewBag.PageInfo = pageInfo;

前台VIEW页面代码如下:(注: ROIS是我专案名称,依实际情况更换)

@using (Html.BeginForm())
{
      这里面是数据列表HTML代码

      @Html.Partial("_Pager", ViewBag.PageInfo as ROIS.Models.PageInfo)

}

原文出自我的个人网站:http://www.zuowenjun.cn/post/2014/08/26/24.html

posted @ 2014-08-26 12:51  梦在旅途  阅读(1190)  评论(0编辑  收藏  举报