我如何在ASP.NET MVC中进行分页?

Spo*_*ike 81 c# asp.net asp.net-mvc

在ASP.NET MVC中进行分页的最优选和最简单的方法是什么?即将列表拆分为多个可浏览页面的最简单方法是什么.

举个例子,我可以从数据库/网关/存储库中获取一个元素列表,如下所示:

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

    return View();
}
Run Code Online (Sandbox Code Playgroud)

为简单起见,我想为我的操作指定一个页码作为参数.像这样:

public ActionResult ListMyItems(int page)
{
   //...
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 100

那么,什么是数据源?你的行动可以采取一些默认的论点,即

ActionResult Search(string query, int startIndex, int pageSize) {...}
Run Code Online (Sandbox Code Playgroud)

默认路由设置,以便startIndex为0,pageSize为(比方说)20:

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

要拆分Feed,您可以非常轻松地使用LINQ:

var page = source.Skip(startIndex).Take(pageSize);
Run Code Online (Sandbox Code Playgroud)

(如果使用"pageNumber"而不是"startIndex",则进行乘法运算)

使用LINQ-toSQL,EF等 - 这也应该"组合"到数据库.

然后,您应该能够使用动作链接到下一页(等):

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

  • 这是一个有趣的路由示例,所以我会赞成它.我还没有深入使用LINQ,所以Skip和Take对我来说是新的.但这绝对是我需要的.这就是为什么我会将此标记为答案. (3认同)

小智 15

我遇到了同样的问题,并为一个Pager Class找到了一个非常优雅的解决方案

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

在您的控制器中,通话看起来像:

return View(partnerList.ToPagedList(currentPageIndex, pageSize));
Run Code Online (Sandbox Code Playgroud)

在你看来:

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


dav*_*v_i 14

我想通过前端介绍一种简单的方法:

控制器:

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);
}
Run Code Online (Sandbox Code Playgroud)

视图:

@* 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>
}
Run Code Online (Sandbox Code Playgroud)

  • `var data = this.dataSource.Skip(page*PageSize).Take(PageSize).ToList();`需要`orderBy(o => o.Id)`才能使用`skip()`|| 除此之外,这是一个很好的答案,值得更多的赞成. (2认同)

Aja*_*nyi 5

这是一个帮助我解决这个问题的链接

它使用 PagedList.MVC NuGet 包。我会尝试总结步骤

  1. 安装 PagedList.MVC NuGet 包

  2. 构建项目

  3. 添加 using PagedList; 到控制器

  4. 修改您的操作以设置页面 public ActionResult ListMyItems(int? page) { List list = ItemDB.GetListOfItems(); int pageSize = 3; int pageNumber = (page ?? 1); return View(list.ToPagedList(pageNumber, pageSize)); }

  5. 在视图底部添加分页链接 @*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 }))

  • 我知道这是一个老问题,这就是为什么这个答案没有太多赞成票。但它应该,因为这是最好的现代解决方案。[PagedList 演示](https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/sorting-filtering-and-paging-with -asp-net-mvc 应用程序中的实体框架) (2认同)