Hoe voer ik paginering uit in ASP.NET MVC?

Wat is de meest geprefereerde en gemakkelijkste manier om paginering uit te voeren in ASP.NET MVC? D.w.z. wat is de gemakkelijkste manier om een ​​lijst op te splitsen in verschillende doorbladerbare pagina’s.

Als voorbeeld, laten we zeggen dat ik een lijst met elementen van een database/gateway/repository als volgt krijg:

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

Omwille van de eenvoud zou ik alleen een paginanummer voor mijn actie als parameter willen specificeren. Zoals dit:

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

Antwoord 1, autoriteit 100%

Wel, wat is de gegevensbron? Uw actie kan een paar standaardargumenten vergen, bijv.

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

standaard ingesteld bij het instellen van routes, zodat startIndex 0 is en pageSize (laten we zeggen) 20 is:

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

Om de feed te splitsen, kun je LINQ vrij eenvoudig gebruiken:

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

(of doe een vermenigvuldiging als u “pageNumber” gebruikt in plaats van “startIndex”)

Met LINQ-toSQL, EF, enz. zou dit ook tot in de database moeten “componeren”.

Je zou dan actie-links naar de volgende pagina (enz.) moeten kunnen gebruiken:

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

Antwoord 2, autoriteit 18%

Ik wilde ook een eenvoudige manier om dit te doen met de front-end bespreken:

Controller:

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

Bekijken:

@* rest of file with view *@
@if (ViewBag.Page > 0)
{
    <a href="@Url.Action("Index", new { page = ViewBag.Page - 1 })" 
       class="btn btn-default">
        &laquo; Prev
    </a>
}
@if (ViewBag.Page < ViewBag.MaxPage)
{
    <a href="@Url.Action("Index", new { page = ViewBag.Page + 1 })" 
       class="btn btn-default">
        Next &raquo;
    </a>
}

Antwoord 3, autoriteit 14%

Ik had hetzelfde probleem en vond een zeer elegante oplossing voor een Pager Class van

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

In je controller ziet de oproep er als volgt uit:

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

en volgens jou:

<div class="pager">
    Seite: <%= Html.Pager(ViewData.Model.PageSize, 
                          ViewData.Model.PageNumber,
                          ViewData.Model.TotalItemCount)%>
</div>

Antwoord 4, autoriteit 5%

Hier is een linkdie heeft me hierbij geholpen.

Het gebruikt het PagedList.MVC NuGet-pakket. Ik zal proberen de stappen samen te vatten

  1. Installeer het PagedList.MVC NuGet-pakket

  2. Project bouwen

  3. Toevoegenusing PagedList;aan de controller

  4. Pas je actie aan om de pagina in te stellen

    public ActionResult ListMyItems(int? page)
    {
    List list = ItemDB.GetListOfItems();
    int pageSize = 3;
    int pageNumber = (page ?? 1);
    return View(list.ToPagedList(pageNumber, pageSize));
    }

  5. Paginalinks onderaan uw weergave toevoegen

    @*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 }))


Antwoord 5, autoriteit 2%

Controller

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

Weergave voor het weergeven van het totale aantal pagina’s

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

Antwoord 6, autoriteit 2%

Ik denk dat de eenvoudigste manier om paginering in de ASP.NET MVC-toepassing te maken, het gebruik van de PagedList-bibliotheek is.

Er is een compleet voorbeeld in de volgende github-repository. Ik hoop dat het zou helpen.

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

Demolink: http://ajaxpagination.azurewebsites.net/

Broncode: https://github.com/ungleng/SimpleAjaxPagedListAndSearchMVC5


Antwoord 7

Entiteit

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=@(@[email protected])">&laquo;</a></li>
            @foreach (var item in @Model.Pages)
            {
                <li class="page-item @item.Class"><a class="page-link" href="?page=@([email protected])">@item.Page</a></li>
            }
            <li class="page-item @Model.NextClass"><a class="page-link" href="?page=@(@[email protected])">&raquo;</a></li>
        </ul>
    </div>
 </nav>

Paginglogica

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

Controller gebruiken

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

Antwoord 8

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>

Antwoord 9

In de ASP .NET-toepassing om paginapaginering in te voegen, moet u eerst Paged List en PagedList.MVC installeren vanuit de NuGet-pakketten voor het project.

Vervolgens heb ik een voorbeeldmethode toegevoegd die de lijst met boeken uit de database retourneert. En ik heb de paginapaginering toegevoegd om 4 items op elke pagina weer te geven.

public ActionResult Books(int? i)
    {
        IEnumerable<Books> BooksList;
        HttpResponseMessage response = GlobalVariables.webApiClient.GetAsync("Tbl_Books").Result;
        BooksList = response.Content.ReadAsAsync<IEnumerable<Books>>().Result;
        return View(BooksList.ToList().ToPagedList(i ?? 1, 4));
    }

In de weergavepagina moet dit worden opgenomen.

@Html.PagedListPager(Model, i => Url.Action("Books", "Library", new { i }))

Other episodes