學習ASP.NET Core Razor 編程系列十六——排序

来源:https://www.cnblogs.com/chillsrc/archive/2018/08/03/9415425.html
-Advertisement-
Play Games

在本教程中,我們來學習如何進行排序。 通過前面的教程學習,你可以實現一個簡單的書籍管理系統。 在本教程將向書籍索列表頁面中添加排序功能。 列標題是一個鏈接,用戶可以單擊它使數據按該列排序。 反覆單擊列標題在升序排列和降序排列之間切換。 ...


學習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 編程系列十四——文件上傳功能(二)

學習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中單步執行調試程式。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Spring5源碼解析-Spring框架中的單例和原型bean 最近一直有問我單例和原型bean的一些原理性問題,這裡就開一篇來說說的 通過Spring中的依賴註入極大方便了我們的開發。在xml通過<bean>定義(或者通過@Bean在配置類里定義)對象之後,然後只需簡單地使用@Autowired註 ...
  • python中有兩種數據類型:一種是可變數據類型,一種是不可變數據類型 不可變數據類型包括(整型及其他數據類型,字元串及元組) 可變數據類型(列表,集合,字典,類和類實例) 鑒定是否為拷貝還是只是引用計數加1,我們可以用python的內置函數(id())來驗證. 程式運行結果表明s和s1的記憶體地址是 ...
  • 1. Apache Kafka是一個分散式流平臺 1.1 流平臺有三個關鍵功能: 1.2 Kafka通常用於兩大類應用: 1.3 有幾個特別重要的概念: Kafka is run as a cluster on one or more servers that can span multiple d ...
  • 一:定義 對於代碼塊和功能的封裝和定義 二:函數的定義, 函數名, 函數體以及函數的調用 我們使用def關鍵字來定義函數, 函數的定義語法: 函數名的命名規則和變數基本一致, 函數體就是函數被執行之後要執行的代碼 函數名()的形式用來調用函數. 三:函數的返回 return關鍵字會中斷函數,並返回一 ...
  •  Net Core平臺靈活簡單的日誌記錄框架NLog初體驗 前幾天分享的"[Net Core集成Exceptionless分散式日誌功能以及全局異常過濾][https://www.cnblogs.com/yilezhu/p/9339017.html]" 有人說比較重量,生產環境部署也比較麻煩。因此 ...
  • [TOC] 1.1 簡介 本章介紹在C 中實現線程同步的幾種方法。因為多個線程同時訪問共用數據時,可能會造成共用數據的損壞,從而導致與預期的結果不相符。為瞭解決這個問題,所以需要用到線程同步,也被俗稱為“加鎖”。但是 加鎖絕對不對提高性能,最多也就是不增不減 ,要實現性能不增不減還得靠高質量的 同步 ...
  • ArrayList ,List ArrayList 和 List 都是不限制長度的集合類型 ,List相比ArrayList 就內部實現而言除了泛型本質沒有太大區別。不過為避免裝箱拆箱問題,儘可能使用List 集合內部是由數組實現,預設大小是4,但你使用無參構造函數構造實例時,內部數組大小是0,當你 ...
  • //如果拿不到當前HttpContext上下文的話可以用該方法取得絕對路徑 var filePath = HostingEnvironment.MapPath("需要獲取絕對路徑 的 相對路徑"); 當然瞭如果可以拿到當前的HTTPcontext上下文的話直接用 Request.MapPath("相 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...