paging in asp.net mvc

i have an asp.net website where i do paging through on the code behind using:

    PagedDataSource objPds = new PagedDataSource
                                 {
                                     DataSource = ds.Tables[0].DefaultView,
                                     AllowPaging = true,
                                     PageSize = 12
                                 };

what is the equivalent best way of doing paging for asp.net-mvc. I would think this would actually belong in the view code.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

I would just define a custom route with the page number in it:

routes.MapRoute(
                "Books", // Route name
                "books/{page}", // URL with parameters
                new {controller = "Books", action = "List", page = 1}
                );

Will give you this kind of Url:

http://localhost/books/4/

Then in your controller action you get this page number:

public BooksController
{
    public ActionResult List (int page)
    {
        /* Retrieve records for the requested page from the database */

        return View ();
    }
}

So your view will not actually be aware of the current page. It will just display a list of supplied records.

You will also need to generate links to various pages either in this view directly or maybe in your master page.

Method 2

There is a good paging class example in the Nerd Dinner project:

public class PaginatedList<T> : List<T> {

        public int PageIndex  { get; private set; }
        public int PageSize   { get; private set; }
        public int TotalCount { get; private set; }
        public int TotalPages { get; private set; }

        public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize) {
            PageIndex = pageIndex;
            PageSize = pageSize;
            TotalCount = source.Count();
            TotalPages = (int) Math.Ceiling(TotalCount / (double)PageSize);

            this.AddRange(source.Skip(PageIndex * PageSize).Take(PageSize));
        }

        public bool HasPreviousPage {
            get {
                return (PageIndex > 0);
            }
        }

        public bool HasNextPage {
            get {
                return (PageIndex+1 < TotalPages);
            }
        }

Method 3

If you buy:
Professional ASP.NET MVC 1.0 (Wrox Programmer to Programmer)

The section in there about Ajax and JsonResult … very good walkthrough of how to set up both an javascript and non-javascript solution. I haven’t actually implemented it, so I don’t remember too much about it, I just remember when I read it, I thought it would work perfectly for paging on my new site.

Decent tutorial here as well:
http://www.asp.net/learn/mvc/tutorial-32-cs.aspx

Method 4

I will explain the way to implement pagination in asp.net mvc.

ProductController.cs

private ProductContext db = new ProductContext ();

public ActionResult Index()
{
    string pageString = "";
    try
    {
        pageString = Request.Url.Segments[3];
    }
    catch (Exception)
    {
        pageString = null;
    }

    int page = (String.IsNullOrEmpty(pageString)) ? 1 : Int32.Parse(pageString);
    Product userModel = new Product();
    int totalProducts = userModel.GetTotalProducts();

    PaginationFunction pagination = new PaginationFunction(true);
    pagination.BaseUrl = "/Product/Index/";
    pagination.TotalRows = totalProducts;
    pagination.CurPage = page;
    pagination.PerPage = 5;
    pagination.PrevLink = "Prev";
    pagination.NextLink = "Next";
    string pageLinks = pagination.GetPageLinks();
    int start = (page - 1) * pagination.PerPage;
    int offset = pagination.PerPage;

    List<Product> products = userModel.GetProducts(start, offset);

    ViewData["title"] = "Pagination in Asp.Net Mvc";
    ViewData["totalProducts"] = totalProducts;
    ViewData["products"] = products;
    ViewData["pageLinks"] = pageLinks;

    return View(db.Products.ToList());
}

ProductModel.cs

public class Product
    {
        private ProductContext db = new ProductContext ();

        public int GetTotalProducts()
        {
            return db.Products.Count();
        }

        public List<Product> GetProducts()
        {
            return db.Products.ToList();
        }
        public List<Product> GetProducts(int start, int offset)
        {
            IEnumerable<Product> query = from m in db.Products
                                       orderby m.Id descending
                                       select m;
            query = query.Skip(start).Take(offset);
            return query.ToList();
        }

    }

Index.aspx

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
    <h2>View Users</h2>
    <p>
    <%: Html.ActionLink("Create New", "Create") %>
    </p>
    <p>Total Users: <strong><%= ViewData["totalProducts"] %></strong></p>

    <% if ((int)ViewData["totalProducts"] == 0)
       { %>
        <p>Sorry! No Users Found.</p>
    <% }
       else
       { %>    
    <table border="0" cellspacing="0" cellpadding="0" width="100%" class="list">
        <tr>
            <th>Name</th>
            <th>Price</th>
            <th>CreatedDate</th>
            <th>UpdatedDate</th>
            <th></th>
        </tr>

        <% foreach (Product u in (List<Product>)ViewData["products"]) 
           { %>        
            <tr>
                <td><%= u.Name%></td>
                <td><%= u.Price %></td>
                <td><%= u.CreatedDate %></td>
                <td><%= u.UpdatedDate%></td>
                <td>
                    <%: Html.ActionLink("Edit", "Edit", new { id=u.Id }) %> |
                    <%: Html.ActionLink("Details", "Details", new { id=u.Id }) %> |
                    <%: Html.ActionLink("Delete", "Delete", new { id=u.Id }) %>
                </td>
            </tr> 
        <% } %>
    </table>

        <br />
        <% if ((string)ViewData["pageLinks"] != "")
           { %>
           <%= ViewData["pageLinks"] %>
           <br /><br />
        <% } %>       
    <% } %>
</asp:Content>


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x