मैं ASP.NET MVC में पेजेशन कैसे करूँ?


85

ASP.NET MVC में पेजेशन करने का सबसे पसंदीदा और आसान तरीका क्या है? यानी एक सूची को कई ब्राउज़ करने योग्य पृष्ठों में तोड़ने का सबसे आसान तरीका क्या है।

उदाहरण के रूप में मैं कहता हूं कि मुझे डेटाबेस / गेटवे / रिपॉजिटरी जैसे तत्वों की एक सूची मिलती है:

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

    return View();
}

सादगी के लिए मैं पैरामीटर के रूप में अपनी कार्रवाई के लिए सिर्फ एक पृष्ठ संख्या निर्दिष्ट करना चाहूंगा। इस कदर:

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

जवाबों:


106

खैर, डेटा स्रोत क्या है? आपकी कार्रवाई कुछ डिफ़ॉल्ट तर्क ले सकती है, अर्थात

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

रूट सेटअप में डिफ़ॉल्ट इसलिए कि startIndex 0 है और पृष्ठ आकार है (कहो) 20:

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

फ़ीड को विभाजित करने के लिए, आप LINQ का उपयोग आसानी से कर सकते हैं:

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

(या एक गुणा करें यदि आप "startIndex" के बजाय "पेजनंबर" का उपयोग करते हैं)

LINQ-toSQL, EF, आदि के साथ - यह भी डेटाबेस के लिए "रचना" करना चाहिए।

फिर आपको अगले पृष्ठ (आदि) पर कार्रवाई-लिंक का उपयोग करने में सक्षम होना चाहिए:

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

3
यह एक दिलचस्प रूटिंग उदाहरण है, इसलिए मैं इसे बढ़ा दूंगा। मैं LINQ का उपयोग करने के खांचे में अभी तक नहीं आया है, इसलिए स्किप और टेक मेरे लिए नया है। लेकिन यह निश्चित रूप से है कि मुझे क्या चाहिए। और इसीलिए मैं इसे उत्तर के रूप में चिह्नित करूँगा।
10

awsome सामान! आपका बहुत - बहुत धन्यवाद।
रिक टोक्यो

MVC2 का उपयोग करते हुए, ActionLinkपृष्ठ का अनुरोध करते समय आपका सिंटैक्स मुझे एक संकलन त्रुटि दे रहा है। CS0103: वर्तमान संदर्भ में 'startIndex' नाम मौजूद नहीं है। क्या यह तकनीक MVC2 के साथ संभव नहीं है?
कॉमकेम

@comecme का अर्थ है अंतिम पंक्ति? आपको उन मूल्यों (या चर) को प्रदान करने की आवश्यकता है। क्या है कि शुरू सूचकांक / पेज आकार?
मार्क Gravell

1
हाँ, मेरा मतलब है अंतिम पंक्ति। मुझे लगा कि आप करंट का उपयोग कर रहे हैं startIndexऔर pageSizeइसे जोड़ रहे हैं। मुझे उम्मीद है कि यह स्वचालित रूप से अंतिम कॉल के मूल्यों का उपयोग करेगा Search। मैं अपने में startIndexअंतिम से कैसे उपयोग Searchकरूंगा ActionLink?
कॉमकेम

16

मुझे एक ही समस्या थी और एक पेजर क्लास के लिए बहुत ही सुंदर समाधान मिला

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>

यह ASP.NET MVC पूर्वावलोकन के लिए है। क्या यह ASP.NET MVC बीटा के लिए काम करेगा?
स्पोइक

लिंक परिवर्तित, RC1 के लिए कोड अपडेट किया गया (अनुमान है कि यह 1.0 के साथ भी काम करेगा, अब प्रयास करेगा)। blogs.taiga.nl/martijn/2008/08/27/paging-with-aspnet-mvc
Palantir

16

मैं सामने वाले छोर से भी ऐसा करने का एक सरल तरीका कवर करना चाहता था:

नियंत्रक:

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

3
var data = this.dataSource.Skip(page * PageSize).Take(PageSize).ToList();orderBy(o => o.Id)उपयोग करने से पहले आपको आवश्यकता होती है skip()|| इसके अलावा यह एक महान जवाब है जो बहुत अधिक उत्थान के योग्य है।
बजे वेक्स

4

यहाँ एक लिंक है जो मुझे इससे मदद करता है।

यह 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 }))


1
मुझे पता है कि यह एक पुराना सवाल है, जिसके कारण इस उत्तर में कई बदलाव नहीं हैं। लेकिन इसके बाद से यह सबसे अच्छा आधुनिक समाधान है। PagedList डेमो
omgGenerics

2

नियंत्रक

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

व्यापार का तर्क

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

2

मुझे लगता है कि ASP.NET MVC एप्लिकेशन में पेजेशन बनाने का सबसे आसान तरीका PagedList लाइब्रेरी का उपयोग करना है।

गिथुब भंडार में निम्नलिखित उदाहरण है। आशा है कि यह मदद करेगा।

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.azurewebooks.net/

स्रोत कोड: https://github.com/ungleng/SimpleAjaxPagedListAndSearchMVC5


1

सत्ता

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

एचटीएमएल

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

पेजिंग लॉजिक

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

"प्लेस" क्लास क्या है?
फ्रीविस

1
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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.