如何在ASP中进行分页。净MVC吗?

时间:2022-10-30 09:23:23

What is the most preferred and easiest way to do pagination in ASP.NET MVC? I.e. what is the easiest way to break up a list into several browsable pages.

在ASP中,最首选和最简单的分页方法是什么?净MVC吗?也就是说,将一个列表分解成几个可浏览的页面最简单的方法是什么。

As an example lets say I get a list of elements from a database/gateway/repository like this:

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

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

    return View();
}

For simplicity's sake I'd like to specify just a page number for my action as parameter. Like this:

为了简单起见,我只想为我的操作指定一个页码作为参数。是这样的:

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

7 个解决方案

#1


92  

Well, what is the data source? Your action could take a few defaulted arguments, i.e.

那么,数据源是什么呢?您的操作可能会出现一些默认的参数,比如。

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

defaulted in the routes setup so that startIndex is 0 and pageSize is (say) 20:

在路径设置中默认设置,使startIndex为0,pageSize为(比如说)20:

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

To split the feed, you can use LINQ quite easily:

要分割提要,可以很容易地使用LINQ:

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

(or do a multiplication if you use "pageNumber" rather than "startIndex")

(或者使用“pageNumber”而不是“startIndex”进行乘法运算)

With LINQ-toSQL, EF, etc - this should "compose" down to the database, too.

使用LINQ-toSQL、EF等——这也应该“组合”到数据库中。

You should then be able to use action-links to the next page (etc):

你应该能够使用行动链接到下一页(等等):

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

#2


15  

I had the same problem and found a very elegant solution for a Pager Class from

我遇到了同样的问题,并为一个寻呼机类找到了一个非常优雅的解决方案

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

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

In your controller the call looks like:

在控制器中,调用看起来如下:

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

and in your view:

在你的观点:

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

#3


11  

I wanted to cover a simple way of doing this with the front end too:

我也想用前端介绍一种简单的方法:

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

View:

观点:

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

#4


1  

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

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

View for displaying total page count

显示页面总数的视图

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

#5


1  

I think the easiest way to create pagination in ASP.NET MVC application is using PagedList library.

我认为在ASP中创建分页最简单的方法。NET MVC应用程序正在使用PagedList库。

There is a complete example in following github repository. Hope it would help.

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

Demo Link: http://ajaxpagination.azurewebsites.net/

演示链接:http://ajaxpagination.azurewebsites.net/

Source Code: https://github.com/ungleng/SimpleAjaxPagedListAndSearchMVC5

源代码:https://github.com/ungleng/SimpleAjaxPagedListAndSearchMVC5

#6


1  

Entity

实体

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

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)">&laquo;</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)">&raquo;</a></li>
            </ul>
        </div>
</nav>

Paging Logic

分页逻辑

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

Using Controller

使用控制器

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

#7


0  

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>

#1


92  

Well, what is the data source? Your action could take a few defaulted arguments, i.e.

那么,数据源是什么呢?您的操作可能会出现一些默认的参数,比如。

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

defaulted in the routes setup so that startIndex is 0 and pageSize is (say) 20:

在路径设置中默认设置,使startIndex为0,pageSize为(比如说)20:

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

To split the feed, you can use LINQ quite easily:

要分割提要,可以很容易地使用LINQ:

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

(or do a multiplication if you use "pageNumber" rather than "startIndex")

(或者使用“pageNumber”而不是“startIndex”进行乘法运算)

With LINQ-toSQL, EF, etc - this should "compose" down to the database, too.

使用LINQ-toSQL、EF等——这也应该“组合”到数据库中。

You should then be able to use action-links to the next page (etc):

你应该能够使用行动链接到下一页(等等):

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

#2


15  

I had the same problem and found a very elegant solution for a Pager Class from

我遇到了同样的问题,并为一个寻呼机类找到了一个非常优雅的解决方案

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

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

In your controller the call looks like:

在控制器中,调用看起来如下:

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

and in your view:

在你的观点:

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

#3


11  

I wanted to cover a simple way of doing this with the front end too:

我也想用前端介绍一种简单的方法:

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

View:

观点:

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

#4


1  

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

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

View for displaying total page count

显示页面总数的视图

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

#5


1  

I think the easiest way to create pagination in ASP.NET MVC application is using PagedList library.

我认为在ASP中创建分页最简单的方法。NET MVC应用程序正在使用PagedList库。

There is a complete example in following github repository. Hope it would help.

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

Demo Link: http://ajaxpagination.azurewebsites.net/

演示链接:http://ajaxpagination.azurewebsites.net/

Source Code: https://github.com/ungleng/SimpleAjaxPagedListAndSearchMVC5

源代码:https://github.com/ungleng/SimpleAjaxPagedListAndSearchMVC5

#6


1  

Entity

实体

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

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)">&laquo;</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)">&raquo;</a></li>
            </ul>
        </div>
</nav>

Paging Logic

分页逻辑

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

Using Controller

使用控制器

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

#7


0  

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>