我有一个asp.net网站,我在其中使用以下代码进行分页:
PagedDataSource objPds = new PagedDataSource
{
DataSource = ds.Tables[0].DefaultView,
AllowPaging = true,
PageSize = 12
};
为asp.net-mvc做分页的等效最佳方法是什么。我认为这实际上属于视图代码。
答案 0 :(得分:11)
我只想定义一个带有页码的自定义路线:
routes.MapRoute(
"Books", // Route name
"books/{page}", // URL with parameters
new {controller = "Books", action = "List", page = 1}
);
会给你这种网址:
http://localhost/books/4/
然后在您的控制器操作中,您将获得此页码:
public BooksController
{
public ActionResult List (int page)
{
/* Retrieve records for the requested page from the database */
return View ();
}
}
因此,您的视图实际上不会知道当前页面。它只显示提供的记录列表。
您还需要直接在此视图中或在母版页中生成指向各种页面的链接。
答案 1 :(得分:5)
Nerd Dinner项目中有一个很好的分页类示例:
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);
}
}
答案 2 :(得分:0)
如果您购买:
专业的ASP.NET MVC 1.0(Wrox程序员到程序员)
关于Ajax和JsonResult的部分......如何设置javascript和非javascript解决方案的非常好的演练。我实际上没有实现它,所以我不记得太多了,我只记得当我读它时,我认为它可以很好地在我的新网站上进行分页。
答案 3 :(得分:0)
我将解释在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>