Comment est-ce que je fais la pagination dans ASP.NET MVC?

Quelle est la manière la plus préférée et la plus simple de faire de la pagination dans ASP.NET MVC? C’est-à-dire le moyen le plus simple de diviser une liste en plusieurs pages de navigation.

A titre d’exemple, disons que je reçois une liste d’éléments d’une firebase database / passerelle / référentiel comme ceci:

public ActionResult ListMyItems() { List list = ItemDB.GetListOfItems(); ViewData["ItemList"] = list; return View(); } 

Pour simplifier, j’aimerais spécifier un numéro de page pour mon action en tant que paramètre. Comme ça:

 public ActionResult ListMyItems(int page) { //... } 

Eh bien, quelle est la source de données? Votre action pourrait prendre quelques arguments par défaut, à savoir

 ActionResult Search(ssortingng query, int startIndex, int pageSize) {...} 

par défaut dans la configuration des routes afin que startIndex soit 0 et pageSize soit (disons) 20:

  routes.MapRoute("Search", "Search/{query}/{startIndex}", new { controller = "Home", action = "Search", startIndex = 0, pageSize = 20 }); 

Pour diviser le stream, vous pouvez utiliser LINQ assez facilement:

 var page = source.Skip(startIndex).Take(pageSize); 

(ou faites une multiplication si vous utilisez “pageNumber” plutôt que “startIndex”)

Avec LINQ-toSQL, EF, etc. – cela devrait aussi “composer” avec la firebase database.

Vous devriez alors pouvoir utiliser des liens d’action vers la page suivante (etc.):

 < %=Html.ActionLink("next page", "Search", new { query, startIndex = startIndex + pageSize, pageSize }) %> 

J’ai eu le même problème et j’ai trouvé une solution très élégante pour une classe Pager de

http://blogs.taiga.nl/martijn/2008/08/27/paging-with-aspnet-mvc/

Dans votre contrôleur, l’appel ressemble à:

 return View(partnerList.ToPagedList(currentPageIndex, pageSize)); 

et à votre avis:

 
Seite: < %= Html.Pager(ViewData.Model.PageSize, ViewData.Model.PageNumber, ViewData.Model.TotalItemCount)%>

Je voulais couvrir une manière simple de le faire avec le front-end aussi:

Manette:

 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); } 

Vue:

 @* rest of file with view *@ @if (ViewBag.Page > 0) {  « Prev  } @if (ViewBag.Page < ViewBag.MaxPage) {  Next »  } 

Manette

  [HttpGet] public async Task 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); } 

BusinessLogic

  public List GetMatchCore(int page, int pageSize, out int totalRecord, out int totalPage) { SignalRDataContext db = new SignalRDataContext(); var query = new List(); 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; } 

Affichage pour afficher le nombre total de pages

  if (ViewBag.dbCount != null) { for (int i = 1; i < = ViewBag.dbCount; i++) { 
  • @Html.ActionLink(@i.ToSsortingng(), "Index", "Grid", new { page = @i },null)
  • } }

Entité

 public class PageEntity { public int Page { get; set; } public ssortingng Class { get; set; } } public class Pagination { public List Pages { get; set; } public int Next { get; set; } public int Previous { get; set; } public ssortingng NextClass { get; set; } public ssortingng PreviousClass { get; set; } public bool Display { get; set; } public ssortingng Query { get; set; } } 

HTML

  

Logique de pagination

 public Pagination GetCategoryPaging(int currentPage, int recordCount, ssortingng query) { ssortingng pageClass = ssortingng.Empty; int pageSize = 10, innerCount = 5; Pagination pagination = new Pagination(); pagination.Pages = new List(); 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; } 

Utilisation du contrôleur

 public ActionResult GetPages() { int currentPage = 1; ssortingng search = ssortingng.Empty; if (!ssortingng.IsNullOrEmpty(Request.QuerySsortingng["page"])) { currentPage = Convert.ToInt32(Request.QuerySsortingng["page"]); } if (!ssortingng.IsNullOrEmpty(Request.QuerySsortingng["q"])) { search = "&q=" + Request.QuerySsortingng["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 @{ Layout = null; } < !DOCTYPE html>    Paging   
@foreach (var itm in Model) { }
@itm.Dissortingct @itm.employee @itm.PromotionTo
First page < < @for(int itmp =1; itmp< Convert.ToInt32(ViewBag.pages)+1;itmp++) { @itmp.ToSsortingng() } >> Last page