學習ASP.NET MVC(十一)——分頁

學習ASP.NET MVC 編程系列目錄css

學習ASP.NET MVC(一)——個人第一個ASP.NET MVC應用程序html

學習ASP.NET MVC(二)——個人第一個ASP.NET MVC 控制器編程

學習ASP.NET MVC(三)——個人第一個ASP.NET MVC 視圖工具

學習ASP.NET MVC(四)——個人第一個ASP.NET MVC 實體對象post

學習ASP.NET MVC(五)——個人第一個ASP.NET MVC CURD頁面學習

學習ASP.NET MVC(六)——個人第一個ASP.NET MVC 編輯頁面字體

學習ASP.NET MVC(七)——個人第一個ASP.NET MVC 查詢頁面spa

學習ASP.NET MVC(八)——「Code First Migrations 」工具3d

學習ASP.NET MVC(九)——「Code First Migrations 」工具使用示例code

學習ASP.NET MVC(十)——排序

學習ASP.NET MVC(十一)——分頁

 

 

      在這一篇文章中,咱們將學習如何在MVC頁面中實現分頁的方法。分頁功能是一個很是實用,經常使用的功能,當數據量過多的時候,必然要使用分頁。在今天這篇文章中,咱們學習若是在MVC頁面中使用PagedList.Mvc包來實現分頁功能。

1)  安裝PagedList.Mvc

        首先,咱們須要安裝分頁組件包,在Visual Studio 2010中點擊【項目】-【管理NuGet程序包】,打開NuGet包管理器窗體,在該窗體中,選擇「聯機」標籤,而後搜索pagedlist,以下圖所示。點擊「安裝」按鈕安裝PagedList.Mvc的最新版本(目前最新版本爲4.5.0)。

                   在把PagedList.Mvc安裝完成以後,PagedList包也被安裝上了。以下圖。

                                                        圖1:NuGet包管理器中顯示的PagedList.Mvc

        2)  實現帶分頁功能的視圖實體對象和控制器

         把PagedList.Mvc安裝完成以後,第一件事就是增長一個視圖實體對象,用來放置一些查詢屬性與查詢結果。在Models目錄下新增一個ViewBook.cs文件,代碼以下列所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using PagedList;
 
namespace MvcApplication1.Models
{
    public class ViewBook
    {

         public IPagedList<Book> Books { get; set; }
         public string Search { get; set; }      

         public string Category { get; set; }
         public string SortBy { get; set; }     
    }
}

 

   咱們如今須要修改BookController類的SearchIndex方法,以便Books做爲PagedList返回(使用ToPagedList()方法完成)。爲了使用PagedList,咱們還須要設置默認排序。爲了使用PagedList包,咱們首先須要在該文件的頂部添加using PagedList;代碼,而後修改Controllers\BookController.cs文件爲下列粗體顯示的代碼。

        public ActionResult SearchIndex(string Category, string searchString, string sortBy,int? page) { var cateLst = new List<string>(); var cateQry = from d in db.Books orderby d.Category select d.Category; cateLst.AddRange(cateQry.Distinct()); ViewBag.category = new SelectList(cateLst); //排序選項
                var orderbyLst = new Dictionary<string, string> { { "價格從低到高", "price_lowest" }, { "價格從高到低", "price_highest" } }; ViewBag.sortBy = new SelectList(orderbyLst, "Value", "Key"); // [2017-2-14 end]
            var books = from m in db.Books select m; if (!String.IsNullOrEmpty(searchString)) { books = books.Where(s => s.Name.Contains(searchString)); } // sort the results
            switch (sortBy) { case "price_lowest": books = books.OrderBy(p => p.Price); break; case "price_highest": books = books.OrderByDescending(p => p.Price); break; default: books = books.OrderBy(p => p.Name); break; } //分頁 const int pageItems = 5; int currentPage = (page ?? 1); IPagedList<Book> pageBooks = books.ToPagedList(currentPage, pageItems); // [2017-2-14] ViewBook vbook = new ViewBook(); vbook.Books = pageBooks; vbook.Category = Category; vbook.SortBy = sortBy; vbook.Search = searchString; if (string.IsNullOrEmpty(Category)) vbook.Books =pageBooks; else { vbook.Books =pageBooks.Where(x => x.Category == Category).ToPagedList(currentPage, pageItems); } return View(vbook); }

  以上代碼進行了如下幾回發動,第一處改動是添加了一個int? page參數,它是一個可空整型,表示用戶在書籍查詢頁面中選擇的當前頁碼。當第一次加載書籍查詢頁面時,用戶尚未選擇任何頁碼,所以,這個參數能夠爲null。

  咱們必須確保當前的分類也要保存在視圖實體對象中,所以,咱們添加了vbook.Category = Category;這行代碼。

  代碼books = books.OrderBy(p => p.Name);用於對產品列表進行默認排序,這是由於PagedList要求列表必須是一個有序列表。

  接着,咱們使用代碼const int pageItems = 5;來指定每頁顯示的數據數量。而後,咱們聲明瞭一個整型變量int currentPage = (page ?? 1);來保存當前頁碼,該變量的值是page參數的值,或者是1(當page變量爲null時)。

  咱們使用代碼vbook.Books = books.ToPagedList(currentPage, PageItems);,對產品信息調用了ToPagedList方法,並將當前頁和每頁顯示的條目數傳遞給了ToPagedList方法,而後將該方法的返回值賦值給了視圖實體對象的Books屬性。

  咱們使用代碼viewBook.SortBy = sortBy;將sortBy參數的值保存到視圖實體對象的SortBy屬性中,以便咱們從一頁移動到另外一頁時,產品的排序保持不變。

3) 帶分頁功能的查詢頁面

   在視圖實體對象和控制器中對實現分頁功能的代碼進行修改以後,如今,咱們須要更新視圖文件\Views\Products\SearchIndex.cshtml,在這個視圖文件中顯示一個分頁控件,以便用戶能夠在各頁之間移動。咱們同時也添加了有多少條數據的指示信息。爲了完成這些功能,咱們在該文件中添加了一個using語句,一個書籍總數的指示信息以及在該頁底部顯示一個分頁控件,具體代碼以下面顯示:

 

  @model MvcApplication1.Models.ViewBook
 @using PagedList.Mvc

@{

    ViewBag.Title = "書籍查詢";
}
   <link href="/Content/PagedList.css" rel="stylesheet" type="text/css" /> <h2>書籍查詢</h2>
     @using (Html.BeginForm("SearchIndex","book",FormMethod.Get)){   
         <p>書籍種類: @Html.DropDownList("category", "All")  
           書籍名稱: @Html.TextBox("SearchString") 
              排序: @Html.DropDownList("sortBy", "不排序")
         <input type="submit" value="查詢" /> </p>
        }

<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Books.First().Category)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Books.First().Name)

        </th>
        <th>
            @Html.DisplayNameFor(model => model.Books.First().Numberofcopies)

        </th>
        <th>
            @Html.DisplayNameFor(model => model.Books.First().AuthorID)

        </th>
        <th>
            @Html.DisplayNameFor(model => model.Books.First().Price)

        </th>
        <th>
            @Html.DisplayNameFor(model => model.Books.First().PublishDate)

        </th>
        <th></th>

    </tr>
@foreach (var item in Model.Books) {

    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Category)

        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Name)

        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Numberofcopies)

        </td>
        <td>
            @Html.DisplayFor(modelItem => item.AuthorID)

        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)

        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PublishDate)

        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.BookID }) |

            @Html.ActionLink("Details", "Details", new { id=item.BookID }) |

            @Html.ActionLink("Delete", "Delete", new { id=item.BookID })

        </td>
    </tr>
}
</table>

<div> Page @(Model.Books.PageCount < Model.Books.PageNumber ? 0 : Model.Books.PageNumber) of @Model.Books.PageCount @Html.PagedListPager(Model.Books, page => Url.Action("SearchIndex", new { category = Model.Category, 
search = Model.Search, sortBy = Model.SortBy, page }))
</div>

       分頁連接生成代碼包裹在div標籤內。其中第一行代碼使用?:操做符的第一行代碼決定是否有任何頁碼顯示,它顯示「Page 0 of 0」或者「Page x of y」,x表示當前頁碼,y表示總頁數。

       第二行代碼使用來自於PagedList.Mvc命名空間的PagedListPager輔助器。該輔助器接收一個產品列表參數,併爲每一個頁面生成一個超連接。Url.Action用於生成一個含有當前頁參數超連接目標。咱們將一個匿名類型(含有當前分類、搜索條件、排序信息和分頁)傳遞給該輔助器方法,以便每一個頁面的連接中都包含一個查詢字符串,這個查詢字符串包含有當前分類、搜索條件、排序信息和分頁信息。這意味着,當從一個頁面移動到另外一個頁面時,搜索條件、選擇的分類和排序規則都被保存下來。若是沒有這樣作,書籍列表將會被重置爲顯示全部書籍信息。

        在使用了上述代碼後,按「價格從低到高」排序分頁界面,以下圖1。

 圖1

      咱們發現分頁的數字部分,並很差看,原來咱們缺乏引用了CSS,在查詢頁面的標題下方添加以下代碼。在上述代碼中的藍色字體。

          <link href="/Content/PagedList.css" rel="stylesheet" type="text/css" />

          再次點擊「查詢」按鈕,而後對其結果按照「價格從低到高」進行排序,效果以下圖2。

 

 圖2:有搜索條件、排序和按分類過濾的分頁效果

相關文章
相關標籤/搜索