i have an asp.net website where i do paging through on the code behind using:
PagedDataSource objPds = new PagedDataSource
{
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);
}
}
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>
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.
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