在本教程中,我們來學習如何進行排序。 通過前面的教程學習,你可以實現一個簡單的書籍管理系統。 在本教程將向書籍索列表頁面中添加排序功能。 列標題是一個鏈接,用戶可以單擊它使數據按該列排序。 反覆單擊列標題在升序排列和降序排列之間切換。 ...
學習ASP.NET Core Razor 編程系列目錄
學習ASP.NET Core Razor 編程系列二——添加一個實體
學習ASP.NET Core Razor 編程系列三——創建數據表及創建項目基本頁面
學習ASP.NET Core Razor 編程系列四——Asp.Net Core Razor列表模板頁面
學習ASP.NET Core Razor 編程系列五——Asp.Net Core Razor新建模板頁面
學習ASP.NET Core Razor 編程系列六——資料庫初始化
學習ASP.NET Core Razor 編程系列七——修改列表頁面
學習ASP.NET Core Razor 編程系列八——併發處理
學習ASP.NET Core Razor 編程系列九——增加查詢功能
學習ASP.NET Core Razor 編程系列十——添加新欄位
學習ASP.NET Core Razor 編程系列十一——把新欄位更新到資料庫
學習ASP.NET Core Razor 編程系列十二——在頁面中增加校驗
學習ASP.NET Core Razor 編程系列十三——文件上傳功能(一)
學習ASP.NET Core Razor 編程系列十四——文件上傳功能(二)
學習ASP.NET Core Razor 編程系列十五——文件上傳功能(三)
在本教程中,我們來學習如何進行排序。
通過前面的教程學習,你可以實現一個簡單的書籍管理系統。 在本教程將向書籍索列表頁面中添加排序功能。
下圖顯示你完成本教程後書籍列表頁面的樣子。 列標題是一個鏈接,用戶可以單擊它使數據按該列排序。 反覆單擊列標題在升序排列和降序排列之間切換。
一、向 OnGetAsync方法添加排序功能
為了在書籍列表頁面中添加排序功能,你將更改書籍控制器中的OnGetAsync或OnGet方法並向書籍索引視圖添加相關的代碼。
1) 在Visual Studio 2017的解決方案資源管理器中找到 Books\ Index.cshtml.cs文件,添加排序字元串,代碼如下:
public string NameSort { get; set; } public string DateSort { get; set; } public string CurrentFilter { get; set; } public string CurrentSort { get; set; }
2) 同時修改OnGetAsync(string author, string searchString)方法,添加排序字元串:
public async Task OnGetAsync(string author, string searchString,string sortOrder) { IQueryable<string> AuthorQuery = from m in _context.Book orderby m.Author select m.Author; var books = from m in _context.Book select m; if (!String.IsNullOrEmpty(searchString)) { books = books.Where(s => s.Name.Contains(searchString)); } if (!String.IsNullOrEmpty(author)) { books = books.Where(x => x.Author == author); } Authors = new SelectList(await AuthorQuery.Distinct().ToListAsync()); //排序 NameSort = String.IsNullOrEmpty(sortOrder) ? "name_desc" : ""; DateSort = sortOrder == "Date" ? "date_desc" : "Date"; switch (sortOrder) { case "name_desc": books = books.OrderByDescending(s => s.Name); break; case "Date": books = books.OrderBy(s => s.ReleaseDate); break; case "date_desc": books = books.OrderByDescending(s => s.ReleaseDate); break; default: books = books.OrderBy(s => s.Name); break; } Book = await books.AsNoTracking().ToListAsync(); }
按上面的代碼從 URL 中的查詢字元串中接收sortOrder參數。 ASP.NET Core 提供的查詢字元串作為參數傳遞給的操作方法。 “Name”或”Date”,後面可以選擇性跟用於指定降序順序的下劃線和”desc”構成參數字元串。 預設排序順序為升序。
第一次請求索引頁時,沒有任何查詢字元串。 書籍按名稱升序顯示也就是預設值中的排序方式。 當用戶單擊列標題的超鏈接,將向OnGetAsync方法提供相應的sortOrder查詢字元串。
Razor 頁面使用 NameSort 和 DateSort 為列標題超鏈接配置相應的排序字元串值。
NameSort = String.IsNullOrEmpty(sortOrder) ? "name_desc" : ""; DateSort = sortOrder == "Date" ? "date_desc" : "Date";
這兩個語句都使用了三目運算符。 第一個語句指如果sortOrder參數為 null 或為空則 NameSort 設置為”name_desc”; 否則,設置為一個空字元串。 這兩個語句實現下表中的功能:
當前的排序順序 |
Name 排序超鏈接 |
出版日期 排序超鏈接 |
Name 升序排列 |
descending |
ascending |
Name 降序排列 |
ascending |
ascending |
出版日期 升序排列 |
ascending |
descending |
出版日期 降序排列 |
ascending |
ascending |
該方法使用 LINQ 指定要作為排序依據的列。 代碼在switch 語句之前創建了IQueryable變數然後在 switch 語句中對其進行修改,併在switch語句之後調用ToListAsync方法。 當你創建和修改IQueryable變數時資料庫不會接收到任何查詢。將 IQueryable 對象轉換成集合後才能執行查詢。 通過調用 IQueryable 等方法可將 ToListAsync 轉換成集合。 因此,IQueryable 代碼會生成單個查詢,此查詢直到出現以下語句才執行:
Book = await books.AsNoTracking().ToListAsync();
二、向書籍列表頁面中的標題添加超鏈接
1) 在Visual Studio 2017中打開Books /Index.cshtml文件,用以下代碼替換,添加列標題超鏈接。 高亮代碼為已更改的行。
@page @model RazorMvcBooks.Pages.Books.IndexModel @{ ViewData["Title"] = "Index"; } <h2>Index</h2> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="Publish" asp-items="Model.Publishs"> <option value="">All</option> </select> 書籍名稱 <input type="text" name="SearchString"> <input type="submit" value="查詢" /> </p> </form> <table class="table"> <thead> <tr> <th> <a asp-page="./Index" asp-route-sortOrder="@Model.NameSort"> @Html.DisplayNameFor(model => model.Book[0].Name) </a> </th> <th> <a asp-page="./Index" asp-route-sortOrder="@Model.DateSort"> @Html.DisplayNameFor(model => model.Book[0].ReleaseDate) </a> </th> <th> @Html.DisplayNameFor(model => model.Book[0].Author) </th> <th> @Html.DisplayNameFor(model => model.Book[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Book[0].Publishing) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Book) { <tr> <td> @Html.DisplayFor(modelItem => item.Name) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Author) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Publishing) </td> <td> <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> | <a asp-page="./Details" asp-route-id="@item.ID">Details</a> | <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a> </td> </tr> } </tbody> </table>
對於上面的代碼中的兩行斜體代碼的說明:
向 Name 和 ReleaseDate 列標題添加超鏈接。
使用 NameSort 和 DateSort 中的信息為超鏈接設置當前的排序順序值。
2) 在Visual Studio 2017中按F5,運行書籍管理應用程式。
3) 在瀏覽器中瀏覽到書籍列表頁面。
4) 在書籍列表頁面單擊“Name”2次。如下圖中1與2。
5)在書籍列表頁面單擊“出版日期”2次。如下圖中1與2。
三、瞭解此功能實現過程
如果你想要更好地瞭解此功能的實現過程,可以進行以下操作:
1)在Visual Studio 2017的 Books/Index.cshtml.cs 文件的 switch (sortOrder) 上設置斷點。
2) 添加對 NameSort 和 DateSort 的監視。
3)在 Books/Index.cshtml 中的 @Html.DisplayNameFor(model => model.Book[0].Name) 上設置斷點。
4) 然後在Visual Studio 2017中單步執行調試程式。