Каков наиболее предпочтительный и простой способ разбивки на страницы в ASP.NET MVC? Т.е. как проще всего разбить список на несколько просматриваемых страниц.
В качестве примера скажем, что я получаю список элементов из базы данных / шлюза / репозитория следующим образом:
public ActionResult ListMyItems()
{
List<Item> list = ItemDB.GetListOfItems();
ViewData["ItemList"] = list;
return View();
}
Для простоты я хотел бы указать в качестве параметра только номер страницы для моего действия. Как это:
public ActionResult ListMyItems(int page)
{
//...
}
источник
ActionLink
синтаксис выдает мне ошибку компиляции при запросе страницы. CS0103: Имя startIndex не существует в текущем контексте. Этот метод невозможен с MVC2?startIndex
и прибавляешьpageSize
к нему. Я надеялся, что он автоматически будет использовать значения последнего вызоваSearch
. Как мне использоватьstartIndex
последнийSearch
в моемActionLink
?У меня была такая же проблема, и я нашел очень элегантное решение для класса пейджера из
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> }
источник
var data = this.dataSource.Skip(page * PageSize).Take(PageSize).ToList();
ТребуетсяorderBy(o => o.Id)
перед использованиемskip()
|| Кроме того, это отличный ответ, который заслуживает гораздо больше голосов.Вот ссылка, которая мне в этом помогла.
Он использует пакет NuGet PagedList.MVC. Попробую обобщить шаги
Установите пакет NuGet PagedList.MVC
Построить проект
Добавить
using PagedList;
в контроллерИзмените свое действие, чтобы установить страницу
public ActionResult ListMyItems(int? page) { List list = ItemDB.GetListOfItems(); int pageSize = 3; int pageNumber = (page ?? 1); return View(list.ToPagedList(pageNumber, pageSize)); }
Добавьте ссылки на страницы в нижней части вашего представления
@*Your existing view*@ Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount @Html.PagedListPager(Model, page => Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
источник
Контроллер
[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); }
BusinessLogic
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 - использовать библиотеку 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>
источник