আমি কীভাবে এএসপি.এনইটি এমভিসিতে পেজিনেশন করব?


85

এএসপি.এনইটি এমভিসিতে পৃষ্ঠপোষকতা করার সর্বাধিক পছন্দের এবং সহজতম উপায় কী? অর্থাত কয়েকটি ব্রাউজযোগ্য পৃষ্ঠায় তালিকা ভাঙ্গার সবচেয়ে সহজ উপায়।

উদাহরণ হিসাবে বলা যাক যে আমি এই জাতীয় ডাটাবেস / গেটওয়ে / সংগ্রহস্থল থেকে উপাদানের একটি তালিকা পেয়েছি:

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

    return View();
}

সরলতার জন্য আমি পরামিতি হিসাবে আমার ক্রিয়াকলাপের জন্য কেবল একটি পৃষ্ঠা নম্বর নির্দিষ্ট করতে চাই। এটার মত:

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

উত্তর:


107

ঠিক আছে, তথ্য উত্স কি? আপনার ক্রিয়াটি কয়েকটি ডিফল্ট যুক্তি গ্রহণ করতে পারে, যেমন

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

রুট সেটআপে ডিফল্ট হয়েছে যাতে স্টার্টইন্ডেক্স 0 হয় এবং পৃষ্ঠাসাইজটি (বলুন) 20:

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

ফিডটি বিভক্ত করতে আপনি লিনকিউটি সহজেই ব্যবহার করতে পারেন:

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

(বা যদি আপনি "স্টার্ট ইন্ডেক্স" এর পরিবর্তে "পেজ নম্বর" ব্যবহার করেন তবে একটি গুণটি করুন)

লিনকিউ-টুএসকিউএল, ইএফ, ইত্যাদি সহ - এটিও ডাটাবেসে "রচনা" করা উচিত।

তারপরে আপনার পরবর্তী পৃষ্ঠায় (ইত্যাদি) অ্যাকশন-লিঙ্কগুলি ব্যবহার করতে সক্ষম হওয়া উচিত:

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

4
এটি একটি আকর্ষণীয় রাউটিং উদাহরণ, সুতরাং আমি এটি upvote। আমি এখনও লিনিকিউ ব্যবহারের খাঁজে প্রবেশ করতে পারি নি, তাই স্কিপ এবং টেক আমার কাছে নতুন। তবে তা অবশ্যই আমার দরকার। এবং সে কারণেই আমি এটিকে উত্তর হিসাবে চিহ্নিত করব।
স্পোইক

মজাদার জিনিস! প্রকৃত পক্ষে তোমাকে অনেক ধন্যবাদ.
রিক টোকিও

এমভিসি 2 ব্যবহার করে, আপনার ActionLinkসিনট্যাক্সটি পৃষ্ঠাটির অনুরোধ করার সময় আমাকে একটি সংকলন ত্রুটি দিচ্ছে। CS0103: 'প্রারম্ভিক সূচক' নামটি বর্তমান প্রসঙ্গে নেই। এই কৌশলটি কি এমভিসি 2 দিয়ে সম্ভব নয়?
comecme

@ আয়কমে আপনি শেষ পংক্তিটি বোঝাতে চান? আপনাকে সেই মানগুলি (বা ভেরিয়েবল) সরবরাহ করতে হবে। কি হল যে স্টার্ট সূচক / পৃষ্ঠা-আকার?
মার্ক গ্র্যাভেল

4
হ্যাঁ, আমি শেষ লাইনটি বোঝাচ্ছি। আমি ভেবেছিলাম আপনি বর্তমানটি ব্যবহার করছেন startIndexএবং এতে যুক্ত হন pageSizeto আমি আশা করি এটি স্বয়ংক্রিয়ভাবে শেষ কলটির মানগুলি ব্যবহার করবে Search। আমি আমার startIndexশেষটি কীভাবে ব্যবহার Searchকরব ActionLink?
comecme

16

আমার একই সমস্যা ছিল এবং এর থেকে পেজার ক্লাসের জন্য খুব মার্জিত সমাধান পেয়েছি

http://blogs.taiga.nl/martijn/2008/08/27/pages-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>

এটি এএসপি.নেট এমভিসি পূর্বরূপের জন্য 5.. এটি কি এএসপি.নেট এমভিসি বিটার জন্য কাজ করবে?
স্পোইক

লিঙ্কটি পরিবর্তিত হয়েছে, কোডটি আরসি 1 এ আপডেট হয়েছে (অনুমান করুন এটিও 1.0 এর সাথে কাজ করবে, এখনই চেষ্টা করবে)। ব্লগস.টিগা.এনএল
পালান্টিয়ার

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

4
var data = this.dataSource.Skip(page * PageSize).Take(PageSize).ToList();orderBy(o => o.Id)আপনি ব্যবহার করার আগে একটি প্রয়োজন skip()|| এটি ছাড়াও এটি একটি দুর্দান্ত উত্তর যা আরও অনেকগুলি অগ্রাধিকারের দাবি রাখে।
ভাহাক্স

4

এখানে একটি লিঙ্ক যা আমাকে এটিতে সহায়তা করেছিল।

এটি পেজডলিস্ট.এমভিসি নিউগেট প্যাকেজ ব্যবহার করে। আমি পদক্ষেপগুলি সংক্ষেপে জানার চেষ্টা করব

  1. পেজডলিস্ট.এমভিসি নিউগেট প্যাকেজ ইনস্টল করুন

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


4
আমি জানি এটি একটি পুরানো প্রশ্ন যার কারণে এই উত্তরের অনেকগুলি উত্স নেই। তবে এটি হওয়া উচিত কারণ এটি সেরা আধুনিক সমাধান। পেজডলিস্ট ডেমো
#Generics

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

আমি মনে করি এএসপি.নেট এমভিসি অ্যাপ্লিকেশনটিতে পৃষ্ঠাগুলি তৈরির সবচেয়ে সহজ উপায়টি পেজডলিস্ট লাইব্রেরিটি ব্যবহার করছে।

গিথুব সংগ্রহস্থল অনুসরণ করার একটি সম্পূর্ণ উদাহরণ রয়েছে। আশা করি এটি সাহায্য করবে।

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

উত্স কোড: https://github.com/ungleng/SimpleAjaxPagedListAistSearchMVC5


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>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.