ASP.NET MVC分頁(yè)的實(shí)現(xiàn)方法
在這一篇文章中,我們將學(xué)習(xí)如何在MVC頁(yè)面中實(shí)現(xiàn)分頁(yè)的方法。分頁(yè)功能是一個(gè)非常實(shí)用,常用的功能,當(dāng)數(shù)據(jù)量過(guò)多的時(shí)候,必然要使用分頁(yè)。在今天這篇文章中,我們學(xué)習(xí)如果在MVC頁(yè)面中使用PagedList.Mvc包來(lái)實(shí)現(xiàn)分頁(yè)功能。
1) 安裝PagedList.Mvc
首先,我們需要安裝分頁(yè)組件包,在Visual Studio 2010中點(diǎn)擊【項(xiàng)目】-【管理NuGet程序包】,打開(kāi)NuGet包管理器窗體,在該窗體中,選擇“聯(lián)機(jī)”標(biāo)簽,然后搜索pagedlist,如下圖所示。點(diǎn)擊“安裝”按鈕安裝PagedList.Mvc的最新版本(目前最新版本為4.5.0)。

在把PagedList.Mvc安裝完成之后,PagedList包也被安裝上了。如下圖。

圖1:NuGet包管理器中顯示的PagedList.Mvc
2) 實(shí)現(xiàn)帶分頁(yè)功能的視圖實(shí)體對(duì)象和控制器
把PagedList.Mvc安裝完成之后,第一件事就是增加一個(gè)視圖實(shí)體對(duì)象,用來(lái)放置一些查詢屬性與查詢結(jié)果。在Models目錄下新增一個(gè)ViewBook.cs文件,代碼如下列所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using PagedList;
namespace MvcApplication1.Models
{
public class ViewBook
{
public IPagedList<Book> Books { get; set; }
public string Search { get; set; }
public string Category { get; set; }
public string SortBy { get; set; }
}
}
我們現(xiàn)在需要修改BookController類(lèi)的SearchIndex方法,以便Books作為PagedList返回(使用ToPagedList()方法完成)。為了使用PagedList,我們還需要設(shè)置默認(rèn)排序。為了使用PagedList包,我們首先需要在該文件的頂部添加using PagedList;代碼,然后修改Controllers\BookController.cs文件為下列粗體顯示的代碼。
public ActionResult SearchIndex(string Category, string searchString, string sortBy,int? page)
{
var cateLst = new List<string>();
var cateQry = from d in db.Books
orderby d.Category
select d.Category;
cateLst.AddRange(cateQry.Distinct());
ViewBag.category = new SelectList(cateLst);
//排序選項(xiàng)
var orderbyLst = new Dictionary<string, string>
{
{ "價(jià)格從低到高", "price_lowest" },
{ "價(jià)格從高到低", "price_highest" }
};
ViewBag.sortBy = new SelectList(orderbyLst, "Value", "Key");
// [2017-2-14 end]
var books = from m in db.Books
select m;
if (!String.IsNullOrEmpty(searchString))
{
books = books.Where(s => s.Name.Contains(searchString));
}
// sort the results
switch (sortBy)
{
case "price_lowest":
books = books.OrderBy(p => p.Price);
break;
case "price_highest":
books = books.OrderByDescending(p => p.Price);
break;
default:
books = books.OrderBy(p => p.Name);
break;
}
//分頁(yè)
const int pageItems = 5;
int currentPage = (page ?? 1);
IPagedList<Book> pageBooks = books.ToPagedList(currentPage, pageItems);
// [2017-2-14]
ViewBook vbook = new ViewBook();
vbook.Books = pageBooks;
vbook.Category = Category;
vbook.SortBy = sortBy;
vbook.Search = searchString;
if (string.IsNullOrEmpty(Category))
vbook.Books =pageBooks;
else
{
vbook.Books =pageBooks.Where(x => x.Category == Category).ToPagedList(currentPage, pageItems);
}
return View(vbook);
}
以上代碼進(jìn)行了以下幾次發(fā)動(dòng),第一處改動(dòng)是添加了一個(gè)int? page參數(shù),它是一個(gè)可空整型,表示用戶在書(shū)籍查詢頁(yè)面中選擇的當(dāng)前頁(yè)碼。當(dāng)?shù)谝淮渭虞d書(shū)籍查詢頁(yè)面時(shí),用戶還沒(méi)有選擇任何頁(yè)碼,因此,這個(gè)參數(shù)可以為null。
我們必須確保當(dāng)前的分類(lèi)也要保存在視圖實(shí)體對(duì)象中,因此,我們添加了vbook.Category = Category;這行代碼。
代碼books = books.OrderBy(p => p.Name);用于對(duì)產(chǎn)品列表進(jìn)行默認(rèn)排序,這是因?yàn)镻agedList要求列表必須是一個(gè)有序列表。
接著,我們使用代碼const int pageItems = 5;來(lái)指定每頁(yè)顯示的數(shù)據(jù)數(shù)量。然后,我們聲明了一個(gè)整型變量int currentPage = (page ?? 1);來(lái)保存當(dāng)前頁(yè)碼,該變量的值是page參數(shù)的值,或者是1(當(dāng)page變量為null時(shí))。
我們使用代碼vbook.Books = books.ToPagedList(currentPage, PageItems);,對(duì)產(chǎn)品信息調(diào)用了ToPagedList方法,并將當(dāng)前頁(yè)和每頁(yè)顯示的條目數(shù)傳遞給了ToPagedList方法,然后將該方法的返回值賦值給了視圖實(shí)體對(duì)象的Books屬性。
我們使用代碼viewBook.SortBy = sortBy;將sortBy參數(shù)的值保存到視圖實(shí)體對(duì)象的SortBy屬性中,以便我們從一頁(yè)移動(dòng)到另一頁(yè)時(shí),產(chǎn)品的排序保持不變。
3) 帶分頁(yè)功能的查詢頁(yè)面
在視圖實(shí)體對(duì)象和控制器中對(duì)實(shí)現(xiàn)分頁(yè)功能的代碼進(jìn)行修改之后,現(xiàn)在,我們需要更新視圖文件\Views\Products\SearchIndex.cshtml,在這個(gè)視圖文件中顯示一個(gè)分頁(yè)控件,以便用戶可以在各頁(yè)之間移動(dòng)。我們同時(shí)也添加了有多少條數(shù)據(jù)的指示信息。為了完成這些功能,我們?cè)谠撐募刑砑恿艘粋€(gè)using語(yǔ)句,一個(gè)書(shū)籍總數(shù)的指示信息以及在該頁(yè)底部顯示一個(gè)分頁(yè)控件,具體代碼如下面顯示:
@model MvcApplication1.Models.ViewBook
@using PagedList.Mvc
@{
ViewBag.Title = "書(shū)籍查詢";
}
<link href="/Content/PagedList.css" rel="external nofollow" rel="external nofollow" rel="stylesheet" type="text/css" />
<h2>書(shū)籍查詢</h2>
@using (Html.BeginForm("SearchIndex","book",FormMethod.Get)){
<p>書(shū)籍種類(lèi): @Html.DropDownList("category", "All")
書(shū)籍名稱: @Html.TextBox("SearchString")
排序: @Html.DropDownList("sortBy", "不排序")
<input type="submit" value="查詢" /> </p>
}
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Books.First().Category)
</th>
<th>
@Html.DisplayNameFor(model => model.Books.First().Name)
</th>
<th>
@Html.DisplayNameFor(model => model.Books.First().Numberofcopies)
</th>
<th>
@Html.DisplayNameFor(model => model.Books.First().AuthorID)
</th>
<th>
@Html.DisplayNameFor(model => model.Books.First().Price)
</th>
<th>
@Html.DisplayNameFor(model => model.Books.First().PublishDate)
</th>
<th></th>
</tr>
@foreach (var item in Model.Books) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Category)
</td>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Numberofcopies)
</td>
<td>
@Html.DisplayFor(modelItem => item.AuthorID)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.PublishDate)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.BookID }) |
@Html.ActionLink("Details", "Details", new { id=item.BookID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.BookID })
</td>
</tr>
}
</table>
<div>
Page @(Model.Books.PageCount < Model.Books.PageNumber ? 0 : Model.Books.PageNumber) of @Model.Books.PageCount
@Html.PagedListPager(Model.Books, page => Url.Action("SearchIndex", new { category = Model.Category,
search = Model.Search, sortBy = Model.SortBy, page }))
</div>
分頁(yè)鏈接生成代碼包裹在div標(biāo)簽內(nèi)。其中第一行代碼使用?:操作符的第一行代碼決定是否有任何頁(yè)碼顯示,它顯示“Page 0 of 0”或者“Page x of y”,x表示當(dāng)前頁(yè)碼,y表示總頁(yè)數(shù)。
第二行代碼使用來(lái)自于PagedList.Mvc命名空間的PagedListPager輔助器。該輔助器接收一個(gè)產(chǎn)品列表參數(shù),并為每個(gè)頁(yè)面生成一個(gè)超鏈接。Url.Action用于生成一個(gè)含有當(dāng)前頁(yè)參數(shù)超鏈接目標(biāo)。我們將一個(gè)匿名類(lèi)型(含有當(dāng)前分類(lèi)、搜索條件、排序信息和分頁(yè))傳遞給該輔助器方法,以便每個(gè)頁(yè)面的鏈接中都包含一個(gè)查詢字符串,這個(gè)查詢字符串包含有當(dāng)前分類(lèi)、搜索條件、排序信息和分頁(yè)信息。這意味著,當(dāng)從一個(gè)頁(yè)面移動(dòng)到另一個(gè)頁(yè)面時(shí),搜索條件、選擇的分類(lèi)和排序規(guī)則都被保存下來(lái)。如果沒(méi)有這樣做,書(shū)籍列表將會(huì)被重置為顯示所有書(shū)籍信息。
在使用了上述代碼后,按“價(jià)格從低到高”排序分頁(yè)界面,如下圖1。

圖1
我們發(fā)現(xiàn)分頁(yè)的數(shù)字部分,并不好看,原來(lái)我們?nèi)鄙僖昧薈SS,在查詢頁(yè)面的標(biāo)題下方添加如下代碼。在上述代碼中的藍(lán)色字體。
<link href="/Content/PagedList.css" rel="external nofollow" rel="external nofollow" rel="stylesheet" type="text/css" />
再次點(diǎn)擊“查詢”按鈕,然后對(duì)其結(jié)果按照“價(jià)格從低到高”進(jìn)行排序,效果如下圖2。

圖2:有搜索條件、排序和按分類(lèi)過(guò)濾的分頁(yè)效果
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ASP.NET MVC 5使用X.PagedList.Mvc進(jìn)行分頁(yè)教程(PagedList.Mvc)
- MVC+jQuery.Ajax異步實(shí)現(xiàn)增刪改查和分頁(yè)
- MVC分頁(yè)之MvcPager使用詳解
- ASP.NET MVC分頁(yè)和排序功能實(shí)現(xiàn)
- ASP.NET MVC5 實(shí)現(xiàn)分頁(yè)查詢的示例代碼
- ASP.NET MVC4 HtmlHelper擴(kuò)展類(lèi),實(shí)現(xiàn)分頁(yè)功能
- Asp.net MVC 中利用jquery datatables 實(shí)現(xiàn)數(shù)據(jù)分頁(yè)顯示功能
- ASP.NET MVC4 Razor模板簡(jiǎn)易分頁(yè)效果
- ASP.NET MVC+EF在服務(wù)端分頁(yè)使用jqGrid以及jquery Datatables的注意事項(xiàng)
- MVC使用MvcPager實(shí)現(xiàn)分頁(yè)效果
相關(guān)文章
ASP.NET使用GridView導(dǎo)出Excel實(shí)現(xiàn)方法
這篇文章主要介紹了ASP.NET使用GridView導(dǎo)出Excel實(shí)現(xiàn)方法,是asp.net操作office文件的一個(gè)典型應(yīng)用,代碼中備有較為詳盡的注釋便于讀者理解,需要的朋友可以參考下2014-11-11
.Net Core實(shí)現(xiàn)健康檢查的示例代碼
這篇文章主要介紹了.Net Core實(shí)現(xiàn)健康檢查的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
asp.net內(nèi)置對(duì)象 Response對(duì)象使用介紹
這篇文章主要介紹了asp.net內(nèi)置對(duì)象:Response對(duì)象使用介紹,對(duì)Response對(duì)象感興趣的小伙伴們可以參考一下2015-11-11
asp頁(yè)面和Asp.net頁(yè)面?zhèn)髦形膮?shù)UrlEncode編碼以及接收解碼
在asp中加一個(gè)鏈接,指向asp.net網(wǎng)頁(yè),但asp.net的網(wǎng)址是經(jīng)過(guò)HttpUtility.UrlEncode轉(zhuǎn)換和HttpUtility.UrlDecode解碼的,而asp的server.urlencode卻和HttpUtility.UrlEncode的編碼方式不一樣.2010-04-04
ASP.NET設(shè)計(jì)網(wǎng)絡(luò)硬盤(pán)之查看文件夾實(shí)現(xiàn)代碼
下面要介紹的實(shí)例包括網(wǎng)上硬盤(pán)的許多功能,將一步步為大家進(jìn)行介紹。首先創(chuàng)建工程實(shí)例,然后進(jìn)行主界面的設(shè)計(jì),最后對(duì)各個(gè)功能的實(shí)現(xiàn)分別進(jìn)行介紹2012-10-10
asp.net 產(chǎn)生唯一隨機(jī)碼的方法分析
現(xiàn)在的WEB中經(jīng)常會(huì)需要產(chǎn)生一些邀請(qǐng)碼、激活碼。需要是唯一并且隨機(jī)的。下面總結(jié)下一些常用的產(chǎn)生隨機(jī)碼的方法,并分享自己的1個(gè)方法.2010-10-10

