如何在ASP.NET MVC中进行分页?
在ASP.NET MVC中做分页的最好和最简单的方法是什么? 即什么是分解成几个可浏览页面的列表最简单的方法。
作为一个例子可以说,我从这样的数据库/网关/资源库获取元素的列表:
public ActionResult ListMyItems() { List<Item> list = ItemDB.GetListOfItems(); ViewData["ItemList"] = list; return View(); }
为了简单起见,我想只为我的行为指定一个页码作为参数。 喜欢这个:
public ActionResult ListMyItems(int page) { //... }
那么,数据源是什么? 你的行动可能会采取一些默认的论点,即
ActionResult Search(string query, int startIndex, int pageSize) {...}
在路由设置中默认,startIndex为0,pageSize为20(说)
routes.MapRoute("Search", "Search/{query}/{startIndex}", new { controller = "Home", action = "Search", startIndex = 0, pageSize = 20 });
要分割Feed,你可以很容易地使用LINQ:
var page = source.Skip(startIndex).Take(pageSize);
(或者如果你使用“pageNumber”而不是“startIndex”来进行乘法运算)
有了LINQ toSQL,EF等,这也应该“写”到数据库中。
然后,您应该能够使用到下一页(等)的动作链接:
<%=Html.ActionLink("next page", "Search", new { query, startIndex = startIndex + pageSize, pageSize }) %>
我有同样的问题,并从中find一个非常优雅的寻呼机类的解决scheme
http://blogs.taiga.nl/martijn/2008/08/27/paging-with-aspnet-mvc/
在您的控制器中,调用如下所示:
return View(partnerList.ToPagedList(currentPageIndex, pageSize));
并在你看来:
<div class="pager"> Seite: <%= Html.Pager(ViewData.Model.PageSize, ViewData.Model.PageNumber, ViewData.Model.TotalItemCount)%> </div>
我想覆盖一个简单的方法来做到这一点与前端:
控制器:
public ActionResult Index(int page = 0) { const int PageSize = 3; // you can always do something more elegant to set this var count = this.dataSource.Count(); var data = this.dataSource.Skip(page * PageSize).Take(PageSize).ToList(); this.ViewBag.MaxPage = (count / PageSize) - (count % PageSize == 0 ? 1 : 0); this.ViewBag.Page = page; return this.View(data); }
视图:
@* rest of file with view *@ @if (ViewBag.Page > 0) { <a href="@Url.Action("Index", new { page = ViewBag.Page - 1 })" class="btn btn-default"> « Prev </a> } @if (ViewBag.Page < ViewBag.MaxPage) { <a href="@Url.Action("Index", new { page = ViewBag.Page + 1 })" class="btn btn-default"> Next » </a> }
调节器
[HttpGet] public async Task<ActionResult> Index(int page =1) { if (page < 0 || page ==0 ) { page = 1; } int pageSize = 5; int totalPage = 0; int totalRecord = 0; BusinessLayer bll = new BusinessLayer(); MatchModel matchmodel = new MatchModel(); matchmodel.GetMatchList = bll.GetMatchCore(page, pageSize, out totalRecord, out totalPage); ViewBag.dbCount = totalPage; return View(matchmodel); }
商业逻辑
public List<Match> GetMatchCore(int page, int pageSize, out int totalRecord, out int totalPage) { SignalRDataContext db = new SignalRDataContext(); var query = new List<Match>(); totalRecord = db.Matches.Count(); totalPage = (totalRecord / pageSize) + ((totalRecord % pageSize) > 0 ? 1 : 0); query = db.Matches.OrderBy(a => a.QuestionID).Skip(((page - 1) * pageSize)).Take(pageSize).ToList(); return query; }
查看显示总页数
if (ViewBag.dbCount != null) { for (int i = 1; i <= ViewBag.dbCount; i++) { <ul class="pagination"> <li>@Html.ActionLink(@i.ToString(), "Index", "Grid", new { page = @i },null)</li> </ul> } }
我认为在ASP.NET MVC应用程序中创build分页的最简单方法是使用PagedList库。
在下面的github仓库中有一个完整的例子。 希望这会有所帮助。
public class ProductController : Controller { public object Index(int? page) { var list = ItemDB.GetListOfItems(); var pageNumber = page ?? 1; var onePageOfItem = list.ToPagedList(pageNumber, 25); // will only contain 25 items max because of the pageSize ViewBag.onePageOfItem = onePageOfProducts; return View(); } }
演示链接: http : //ajaxpagination.azurewebsites.net/
源代码: https : //github.com/ungleng/SimpleAjaxPagedListAndSearchMVC5
实体
public class PageEntity { public int Page { get; set; } public string Class { get; set; } } public class Pagination { public List<PageEntity> Pages { get; set; } public int Next { get; set; } public int Previous { get; set; } public string NextClass { get; set; } public string PreviousClass { get; set; } public bool Display { get; set; } public string Query { get; set; } }
HTML
<nav> <div class="navigation" style="text-align: center"> <ul class="pagination"> <li class="page-item @Model.NextClass"><a class="page-link" href="?page=@(@Model.Previous+@Model.Query)">«</a></li> @foreach (var item in @Model.Pages) { <li class="page-item @item.Class"><a class="page-link" href="?page=@(item.Page+@Model.Query)">@item.Page</a></li> } <li class="page-item @Model.NextClass"><a class="page-link" href="?page=@(@Model.Next+@Model.Query)">»</a></li> </ul> </div> </nav>
寻呼逻辑
public Pagination GetCategoryPaging(int currentPage, int recordCount, string query) { string pageClass = string.Empty; int pageSize = 10, innerCount = 5; Pagination pagination = new Pagination(); pagination.Pages = new List<PageEntity>(); pagination.Next = currentPage + 1; pagination.Previous = ((currentPage - 1) > 0) ? (currentPage - 1) : 1; pagination.Query = query; int totalPages = ((int)recordCount % pageSize) == 0 ? (int)recordCount / pageSize : (int)recordCount / pageSize + 1; int loopStart = 1, loopCount = 1; if ((currentPage - 2) > 0) { loopStart = (currentPage - 2); } for (int i = loopStart; i <= totalPages; i++) { pagination.Pages.Add(new PageEntity { Page = i, Class = string.Empty }); if (loopCount == innerCount) { break; } loopCount++; } if (totalPages <= innerCount) { pagination.PreviousClass = "disabled"; } foreach (var item in pagination.Pages.Where(x => x.Page == currentPage)) { item.Class = "active"; } if (pagination.Pages.Count() <= 1) { pagination.Display = false; } return pagination; }
使用控制器
public ActionResult GetPages() { int currentPage = 1; string search = string.Empty; if (!string.IsNullOrEmpty(Request.QueryString["page"])) { currentPage = Convert.ToInt32(Request.QueryString["page"]); } if (!string.IsNullOrEmpty(Request.QueryString["q"])) { search = "&q=" + Request.QueryString["q"]; } /* to be Fetched from database using count */ int recordCount = 100; Place place = new Place(); Pagination pagination = place.GetCategoryPaging(currentPage, recordCount, search); return PartialView("Controls/_Pagination", pagination); }
public ActionResult Paging(int? pageno,bool? fwd,bool? bwd) { if(pageno!=null) { Session["currentpage"] = pageno; } using (HatronEntities DB = new HatronEntities()) { if(fwd!=null && (bool)fwd) { pageno = Convert.ToInt32(Session["currentpage"]) + 1; Session["currentpage"] = pageno; } if (bwd != null && (bool)bwd) { pageno = Convert.ToInt32(Session["currentpage"]) - 1; Session["currentpage"] = pageno; } if (pageno==null) { pageno = 1; } if(pageno<0) { pageno = 1; } int total = DB.EmployeePromotion(0, 0, 0).Count(); int totalPage = (int)Math.Ceiling((double)total / 20); ViewBag.pages = totalPage; if (pageno > totalPage) { pageno = totalPage; } return View (DB.EmployeePromotion(0,0,0) .Skip(GetSkip((int)pageno,20)).Take(20).ToList()); } } private static int GetSkip(int pageIndex, int take) { return (pageIndex - 1) * take; } @model IEnumerable<EmployeePromotion_Result> @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Paging</title> </head> <body> <div> <table border="1"> @foreach (var itm in Model) { <tr> <td>@itm.District</td> <td>@itm.employee</td> <td>@itm.PromotionTo</td> </tr> } </table> <a href="@Url.Action("Paging", "Home",new { pageno=1 })">First page</a> <a href="@Url.Action("Paging", "Home", new { bwd =true })"><<</a> @for(int itmp =1; itmp< Convert.ToInt32(ViewBag.pages)+1;itmp++) { <a href="@Url.Action("Paging", "Home",new { pageno=itmp })">@itmp.ToString()</a> } <a href="@Url.Action("Paging", "Home", new { fwd = true })">>></a> <a href="@Url.Action("Paging", "Home", new { pageno = Convert.ToInt32(ViewBag.pages) })">Last page</a> </div> </body> </html>