學習ASP.NET Core Razor 編程系列九——增加查詢功能

来源:https://www.cnblogs.com/chillsrc/archive/2018/05/11/9025896.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 編程系列八——併發處理

 

      在這一篇教程中我們學習如何增加查詢功能,我們將在書籍列表頁面中添加搜索功能,通過按“書籍名稱”或“作者”來搜索書籍。

一、根據書籍名稱查詢

       使用下麵的代碼來修改書籍列表頁面的 OnGetAsync 方法:

public async Task OnGetAsync(string searchString)
        {

            var books = from m in _context.Book
                         select m; 

            if (!String.IsNullOrEmpty(searchString))
            {
                books = books.Where(s => s.Name.Contains(searchString));
            }
            Book = await books.ToListAsync();
          //  Book = await _context.Book.ToListAsync();
        }

        上面代碼中的OnGetAsync 方法的第一行創建了 LINQ 查詢用於選擇書籍:

var books = from m in _context.Book
                         select m;

        這一行代碼僅僅是對查詢進行了定義,還沒有到傳給資料庫讓資料庫去執行。

        如果 searchString 參數包含一個查詢條件字元串,則查詢語句會根據查詢條件字元串進行修改,代碼如下:

  if (!String.IsNullOrEmpty(searchString))
            {
                books = books.Where(s => s.Name.Contains(searchString));
            }

          s => s.Title.Contains() 這段代碼是 Lambda 表達式。 Lambda 在基於方法的 LINQ 查詢中用作標準查詢運算符方法的參數,如 Where 方法或 Contains(前面的代碼中所使用的)。 在對 LINQ 查詢進行定義或通過調用方法(如 Where、Contains 或 OrderBy)進行修改後,此查詢語句不會被立即執行,會延遲執行。 這意味著表達式的計算會延遲,直到迴圈訪問其實現的值或者調用 ToListAsync 方法。

       註意:Contains 方法在資料庫中運行,而不是在 C# 代碼中運行。 查詢條件是否要區分大小寫取決於你採用什麼樣的資料庫或者你在資料庫中使用什麼樣的排序規則。 在 SQL Server 上,Contains 映射到資料庫查詢語法中的LIKE,這是不區分大小寫的。 在 SQLite 中,如果使用預設排序規則,則查詢條件會區分大小寫。

         在瀏覽器中打開書籍列表頁面,併在瀏覽器的地址欄的URL未尾添加如下字元串 ?searchString=Java (例如 http://localhost:53416/Books?searchString=Java)。 書籍管理系統會根據你輸入的查詢條件顯示相應的書籍列表。下圖中1處是沒有查詢條件下的書籍列表,會顯示全部的書籍信息。而圖中2處,則顯示是的查詢條件為java的書籍信息列表。

 

        如果在書籍列表頁面中添加了以下路由模板,則查詢條件字元串則可作為 URL 地址中的一段傳遞給後臺(例如 http://localhost:53416/Books/Java)。

       @page "{searchString?}" 

        上面的路由約束代碼允許把查詢條件放到URL中做為URL的一段數據來查詢書籍信息。 "{searchString?}" 中的 ? 表示這是可選路由參數。

 

        但是,這樣通過修改URL進行搜索書籍信息的方案對用戶來說非常不友好。所以, 我們在下麵的步驟中,會添加 UI 界面方便用戶來查詢書籍信息。 如果你已經在Index.cshtml頁面中添加路由約束 "{searchString?}",請先將它刪除。

 

        請在Visual Studio 2017的解決方案資源管理器中打開  Pages/Books/Index.cshtml 文件, 在文件中添加一個Form表單,代碼如下:

@page 
@model RazorMvcBooks.Pages.Books.IndexModel

@{
    ViewData["Title"] = "Index";
} 

<h2>Index</h2> 
<p>
    <a asp-page="Create">Create New</a>
</p>

<form>
    <p>
        書籍名稱: <input type="text" name="SearchString">
        <input type="submit" value="Filter" />
    </p>
</form>
<table class="table">

1. 在進行如上代碼修改之後,在瀏覽器中瀏覽可能會出現亂碼,如下圖。

 

2. 對於中文亂碼的解決方案是,在Visual Studio 2017中打開Index.cshtml文件,在菜單中選擇 文件à“Index.cshtml另存為…”菜單 。如下圖。

 

3. 在彈出對話框的“保存”按鈕,用滑鼠點擊下拉箭頭,然後在彈出菜單中選擇“編碼保存…”。如下圖。

 

4. 在彈出對話框中,我們看到頁面預設使用的是“GB2312”編碼 進行保存的,我們選擇“UTF-8”編碼進行保存。操作如下圖。

 

5. 在瀏覽器中按F5進行刷新,然後我們看到中文亂碼沒有了。如下圖。

 

6. 在書籍名稱查詢輸入框中輸入“sql”,然後點擊“查詢”按鈕,系統會根據查詢條件顯示相應的書籍信息。查詢條件會如下圖中1處,自動 添加到Url後面。根據查詢條件得到的查詢結果如下圖2處。

 

二、根據作者查詢

       在Visual Studio 2017的解決方案資源管理器中找到Pages/Books/Index.cshtml.cs文件,並添加二個變數與一個屬性,代碼如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using RazorMvcBooks.Models;
using Microsoft.AspNetCore.Mvc.Rendering; 

namespace RazorMvcBooks.Pages.Books
{
    public class IndexModel : PageModel
    {
        private readonly RazorMvcBooks.Models.BookContext _context;

        public IndexModel(RazorMvcBooks.Models.BookContext context)
        {
            _context = context;
        } 

        public List<Book> Books;
        public SelectList Authors;
        public string Author { get; set; }

            SelectList Author 包含作者列表,方便用戶在界面上選擇一位作者。

          Author屬性包含用戶選擇的特定作者(例如“吳軍”)。

         我們對OnGetAsync 方法進行如下修改。

 

 public async Task OnGetAsync(string author,string searchString)
        { 

            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());           

            Book = await books.ToListAsync();
            //  Book = await _context.Book.ToListAsync();
        }

 

        下麵的代碼是一個 LINQ 查詢的語句,可以從資料庫中查詢所有作者。

 

 IQueryable<string> AuthorQuery = from m in _context.Book
                                             orderby m.Author
                                             select m.Author;

       作者列表 SelectList 是通過以下語句進行創建。      

  Authors = new SelectList(await AuthorQuery.Distinct().ToListAsync());

 

二、 添加作者查詢條件

      在Visual Studio 2017的解決方案資源管理器中找到 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="Author" asp-items="Model.Authors">
            <option value="">All</option>
        </select>
書籍名稱
         <input type="text" name="SearchString">
        <input type="submit" value="查詢" />
    </p>
</form> 

<table class="table">

        通過瀏覽器,參照根據書籍名稱查詢操作,來測試按作者來查詢。如下圖。

 


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

-Advertisement-
Play Games
更多相關文章
  • 在經過一段時間的JAVA基礎學習之後,最近開始學習JAVA中的集合框架,當看到鏈表、散列這些數據結構的時候,總有一些雲里霧裡的感覺,迫不及待的想要瞭解其內部的實現。 目前手上有三本關於數據結構的書籍,《大話數據結構》,《數據結構與演算法分析 C語言描述》,《演算法 第四版》,這些書都經過很多人的推薦,內 ...
  • Python可能兩年前,很多人都沒聽過這門編程語言,聽過最多的肯定就是C和java!那麼Python在近兩年為什麼會這麼火呢?很多人都會講肯定是人工智慧,AI這一塊所帶動的,可能也確實如此!此圖為開源中國出的!既然Python這麼火了?那麼你還在等什麼?等和java一樣飽和了在來學Python嗎。風 ...
  • 我是搞控制項開發的,經常被人問,所以把一些問題記錄了下來!如果有人再問,直接把地址丟給他看。 一、 經常會有人抱怨Winform界面閃爍,下麵有幾個方法可以儘可能的避免出現閃爍 1.控制項的使用儘量以純色為主,儘量不使用背景圖,或者把大圖改成小圖,或者圖片不縮放繪製,或者直接用不透明的純色背景色(Win ...
  • 以前的方案 以前寫過一個圓點繞圈的進度條,主要是在cs文件中動態添加圓點,通過定時器設置角度後,用正弦餘弦設置(x,y)的位置。 此方案優點:不需要UI圖標 此方案缺點:定時器耗性能 WPF 繞圈進度條(一) 現在的方案 如果有UI圖標,或者自己能夠設計矢量圖的情況下,可以通過Xaml實現繞圈動畫的 ...
  • 3章 變數與常量 1)變數概念 2)變數類型 3)變數操作 4)常量 4章 表達式與運算符 1)表達式 2)運算符 3)運算符優先順序 錄製視頻:百度雲盤:https://pan.baidu.com/s/19pMkoUW6zCLyVTlyk7DOkw 密碼:ajp8 隨手筆記:百度雲盤:https:/ ...
  • 示例一,正常使用: 相關定義: public interface ICar { int Run(); } public class BMW : ICar { private int _miles = 0; public int Run() { return ++_miles; } } public ...
  • 要引用Newtonsoft.Json.dll https://download.csdn.net/download/jsqdragoon/10032906?web=web ...
  • 我在上篇隨筆《在WinForm應用程式中快速實現多語言的處理》裡面介紹了Winform開發中多語言的處理解決方案,整個多語言解決方案是以實際需求為驅動,以減少代碼改動,高效處理為目的,通過基類繼承的方式減少代碼修改,通過引入翻譯API方式減少翻譯處理時間,本隨筆繼續深化這個多語言處理方案的介紹,是指... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...