在asp.net mvc中进行分页

时间:2009-08-10 11:11:47

标签: asp.net asp.net-mvc paging

我有一个asp.net网站,我在其中使用以下代码进行分页:

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

为asp.net-mvc做分页的等效最佳方法是什么。我认为这实际上属于视图代码。

4 个答案:

答案 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解决方案的非常好的演练。我实际上没有实现它,所以我不记得太多了,我只记得当我读它时,我认为它可以很好地在我的新网站上进行分页。

这里的体面教程:
http://www.asp.net/learn/mvc/tutorial-32-cs.aspx

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