78

Cách ưa thích nhất và dễ nhất để phân trang trong ASP.NET MVC là gì? Tức là cách dễ nhất để chia danh sách thành nhiều trang có thể duyệt được.

Như một ví dụ cho phép tôi nhận được một danh sách các thành phần từ cơ sở dữ liệu / gateway / kho lưu trữ như thế này:

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

    return View();
}

Để đơn giản, tôi muốn chỉ định một số trang cho hành động của tôi làm tham số. Như thế này:

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

Vâng, nguồn dữ liệu là gì? Hành động của bạn có thể mất một vài đối số mặc định, nghĩa là

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

được mặc định trong thiết lập tuyến đường để startIndex bằng 0 và pageSize là (giả sử) 20:

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

Để phân chia nguồn cấp dữ liệu, bạn có thể sử dụng LINQ khá dễ dàng:

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

(hoặc thực hiện phép nhân nếu bạn sử dụng "số trang" thay vì "start Index")

Với LINQ-toQuery, EF, v.v. - điều này cũng sẽ "soạn" xuống cơ sở dữ liệu.

Sau đó, bạn có thể sử dụng các liên kết hành động đến trang tiếp theo (v.v.):

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

    Đó là một ví dụ định tuyến thú vị, vì vậy tôi sẽ nâng cấp nó. Tôi chưa hiểu rõ về cách sử dụng LINQ, vì vậy Skip và Take là mới đối với tôi. Nhưng đó chắc chắn là những gì tôi cần. Và đó là lý do tại sao tôi đánh dấu đây là câu trả lời.

    – Hoàng Ðức Trung 10:22:35 15/01/2009
  • 1

    công cụ tuyệt vời! Cảm ơn bạn rất nhiều trong chứng thư.

    – Hồ Huệ Nghi 17:01:12 24/07/2009
  • 1

    Sử dụng MVC2, ActionLinkcú pháp của bạn sẽ gây ra lỗi biên dịch khi yêu cầu trang. CS0103: Tên 'start Index' không tồn tại trong bối cảnh hiện tại. Có phải kỹ thuật này là không thể với MVC2?

    – Tạ Uyên Thơ 21:37:26 10/12/2012
  • 1

    @comecme bạn có nghĩa là dòng cuối cùng? bạn cần cung cấp các giá trị (hoặc biến) đó. Có gì có sự khởi đầu-index / trang-kích thước?

    – Tạ Lam Khê 21:43:36 10/12/2012
  • 1

    Vâng, ý tôi là dòng cuối cùng. Tôi nghĩ rằng bạn đang sử dụng hiện tại startIndexvà thêm pageSizevào nó. Tôi hy vọng nó sẽ tự động sử dụng các giá trị của cuộc gọi cuối cùng Search. Làm thế nào tôi sẽ sử dụng startIndextừ cuối cùng Searchtrong của tôi ActionLink?

    – Bùi Khắc Trọng 21:52:57 10/12/2012
15

Tôi đã có cùng một vấn đề và tìm thấy một giải pháp rất thanh lịch cho Lớp Pager từ

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

Trong bộ điều khiển của bạn, cuộc gọi trông giống như:

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

và theo quan điểm của bạn:

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

Tôi cũng muốn nói về một cách đơn giản để làm điều này với giao diện người dùng:

Điều khiển:

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

Lượt xem:

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

    var data = this.dataSource.Skip(page * PageSize).Take(PageSize).ToList();Yêu cầu orderBy(o => o.Id)trước khi bạn có thể sử dụng skip()| | Bên cạnh đó, đây là một câu trả lời tuyệt vời xứng đáng nhận được nhiều sự ủng hộ hơn.

    – Dương Hà Tiên 19:20:17 19/05/2016
2

Bộ điều khiển

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

Xem để hiển thị tổng số trang

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

Thực thể

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)">&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>

Logic phân trang

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

Sử dụng bộ điều khiển

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

Tôi nghĩ cách dễ nhất để tạo phân trang trong ứng dụng ASP.NET MVC là sử dụng thư viện PagedList.

Có một ví dụ đầy đủ trong kho github sau đây. Hy vọng nó sẽ giúp.

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

Liên kết demo: http://ajaxpagination.azurewebsites.net/

Mã nguồn: https://github.com/ungleng/SimpleAjaxPagedListAndSearchMVC5

|
0

Đây là một liên kết giúp tôi với điều này.

Nó sử dụng gói NuGet PagedList.MVC. Tôi sẽ cố gắng tóm tắt các bước

  1. Cài đặt gói NuGet PagedList.MVC

  2. Xây dựng dự án

  3. Thêm using PagedList; vào bộ điều khiển

  4. Sửa đổi hành động của bạn để đặt trang public ActionResult ListMyItems(int? page) { List list = ItemDB.GetListOfItems(); int pageSize = 3; int pageNumber = (page ?? 1); return View(list.ToPagedList(pageNumber, pageSize)); }

  5. Thêm liên kết phân trang vào cuối chế độ xem của bạn @*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 }))

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

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.