分頁這個東西剛開始自己來寫的時候感覺很複雜,在網路上分頁大部分都是比較成熟分頁空間,對於新手的我查看其代碼有時真的看的不太明白,最近自己在用到MVC3做分頁查看資料,有些總結
1、分頁基本參數:pageSize、pageIndex、Total
其中Total,這個也就是要查詢資料的總個數,到時用來產生分頁控制項
2、Controll 部分
public ActionResult Paging(int? pageIndex, int pageSize = 5)
{
int total = 0;
pageIndex = pageIndex == null ? 0 : pageIndex;
//擷取資料
MercuryDbExEntities db = new MercuryDbExEntities();
total = db.Users.Count();
var result = db.Users.OrderBy(p => p.Id).Skip(pageIndex.Value * pageSize).Take(pageSize);
ViewBag.Pagination = new Pagination(pageIndex, pageSize, total);
return View(result);
}
3、
public class Pagination
{
public int? PageIndex { get; private set; }//當前頁號減一的值
public int PageSize { get; private set; } //每頁顯示的內容數量
public int TotalPages { get; private set; }//總頁數
public int Start { get; private set; }//當前頁面,顯示的第一個頁號(比如在中間的頁面,頁號顯示是9號到16號,9就是Start)
public int End { get; private set; }//當前頁面,顯示的最後一個頁號
public Pagination(int? pageIndex, int pageSize, int totalcount)
{
PageIndex = (pageIndex ?? 0);
PageSize = pageSize; ;
TotalPages = (int)Math.Ceiling(totalcount / (double)PageSize);
int size;//判定每個頁面顯示多少個頁號
if (TotalPages > 6)//這裡規定每個頁面顯示6個頁號
{
size = 6;
//定義每個頁面的頁號從幾開始
if (pageIndex > 2 && pageIndex < TotalPages - (size - 2))
{
Start = (pageIndex ?? 0) - 1;
}
else if (pageIndex >= TotalPages - (size - 2))
{
Start = TotalPages - size + 1;
}
else
{
Start = 1;
}
}
else
{
size = TotalPages;
Start = 1;
}
End = Start + size - 1;
}
// 為“上一頁”“下一頁”導航備用
public bool HasPreviousPage
{
get { return (PageIndex > 0); }
}
public bool HasNextPage
{
get { return (PageIndex + 1 < TotalPages); }
}
}
4、View部分
--內容展示部分
@model IEnumerable<Mvc3_Test.DataBase.Users>
@using Mvc3_Test.Htmlhelpers
@{
ViewBag.Title = "Paging";
}
<h2>內容展示</h2>
@foreach (var item in Model)
{
<p>
@item.Id <b>|</b>@item.LoginName
</p>
}
<hr />
@Html.Partial("_Pagination", (Mvc3_Test.Htmlhelpers.Pagination)ViewBag.Pagination)
--分頁標籤展示部分
@model Mvc3_Test.Htmlhelpers.Pagination
@using Mvc3_Test.Htmlhelpers
<div class="clearfix pagination">
<div class="pagination-inner">
@if (Model.Start > 1)
{
//如果當前頁面超過第二頁則顯示第一頁“1...”的連結
string url = Html.UrlSet(Request, "pageIndex", 0);
<a title="第一頁1..." href="@url">1...</a>
}
@for (int i = Model.Start; i <= Model.End; i++)
{
string url = Html.UrlSet(Request, "pageIndex", i - 1);
if (i == Model.PageIndex + 1)
{
//在當前頁面的幾個頁號中尋找當前頁號
<a title="當前第 @i.ToString() 頁" class="current" href="@url">@i.ToString()</a>
}
else
{
<a title="前往第 @i.ToString() 頁@i.ToString()" href="@url">@i.ToString()</a>
}
}
@if (Model.End < Model.TotalPages && Model.PageIndex - Model.Start < 2)
{
//最後一頁
string totalPages = (@Model.TotalPages).ToString();
string url = Html.UrlSet(Request, "pageIndex", Model.TotalPages - 1);
<a title="最後一頁@totalPages" href="@url">@totalPages</a>
}
</div>
</div>
【說明:其中大家看到,在對於A標籤的href中代碼進行了@url處理,因為有時項目中用來展示資料的地方會有很多,所以為了使得“分頁標籤展示頁面”得以重用性,又增加了一個類:HtmlHelpers】
5、HtmlHelpers類
public static class HtmlHelpers
{
public static string UrlSet(this HtmlHelper helper, HttpRequestBase request, string queryName, object queryValue)
{
if (queryName != null && queryValue != null)
{
string path = request.Path;
NameValueCollection query = new NameValueCollection(request.QueryString);
query.Set(queryName, queryValue.ToString());
return CreateUrl(path, query);
}
return request.RawUrl;
}
/// <summary>
///
/// </summary>
/// <param name="helper"></param>
/// <param name="request"></param>
/// <param name="queryName"></param>
/// <param name="queryValue"></param>
/// <returns></returns>
public static string UrlAdd(this HtmlHelper helper, HttpRequestBase request, string queryName, object queryValue)
{
if (queryName != null && queryValue != null)
{
string path = request.Path;
NameValueCollection query = new NameValueCollection(request.QueryString);
query.Add(queryName, queryValue.ToString());
return CreateUrl(path, query);
}
return request.RawUrl;
}
public static string UrlRemove(this HtmlHelper helper, HttpRequestBase request, string queryName)
{
if (queryName != null)
{
string path = request.Path;
NameValueCollection query = new NameValueCollection(request.QueryString);
query.Remove(queryName);
return CreateUrl(path, query);
}
return request.RawUrl;
}
public static string UrlRemove(this HtmlHelper helper, HttpRequestBase request, string queryName, object queryValue)
{
if (queryName != null && queryValue != null)
{
string path = request.Path;
NameValueCollection query = new NameValueCollection(request.QueryString);
string[] values = query.GetValues(queryName);
List<string> vs = values.ToList();
vs.Remove(queryValue.ToString());
query.Remove(queryName);
foreach (var item in vs)
{
query.Add(queryName, item);
}
return CreateUrl(path, query);
}
return request.RawUrl;
}
private static string CreateUrl(string path, NameValueCollection query)
{
string url = path;
if (query != null && query.Count != 0)
{
url += "?";
for (int i = 0; i < query.Count; i++)
{
string key = query.GetKey(i);
string[] values = query.GetValues(key);
for (int j = 0; j < values.Length; j++)
{
url += key + "=" + values[j] + "&";
}
}
url = url.TrimEnd('&');
}
return url;
}
}