生成 Blazor 电影数据库应用(第 6 部分 - 添加搜索)

注意

此版本不是本文的最新版本。 有关当前版本,请参阅本文.NET 9 版本。

重要

此信息与预发布产品相关,相应产品在商业发布之前可能会进行重大修改。 Microsoft 对此处提供的信息不提供任何明示或暗示的保证。

有关当前版本,请参阅本文.NET 9 版本。

本文是 Blazor 电影数据库应用教程的第六部分,介绍有关如何生成具有管理电影数据库功能的 ASP.NET Core Blazor Web App 的基础知识。

本教程系列的这一部分介绍如何向电影 Index 组件添加搜索功能,以便按标题筛选电影。

QuickGrid 组件实现筛选器功能

电影 Index 组件(Components/MoviePages/Index.razor)使用 QuickGrid 组件 显示数据库中的电影:

<QuickGrid Class="table" Items="context.Movie">
    ...
</QuickGrid>

Items 参数接收一个 IQueryable<TGridItem>,其中 TGridItem 是由网格 (Movie) 中的每一行表示的数据类型。 Items 被分配了一个从注入的数据库上下文工厂 (DbSet<Movie>) 创建的数据库上下文 (CreateDbContext) 获取的电影实体 (DbFactory) 的集合。

若要对电影标题进行 QuickGrid 组件筛选,Index 组件应:

  • 将筛选器字符串设置为查询字符串中的组件参数
  • 如果参数具有值,则筛选从数据库返回的电影。
  • 为用户提供输入,以提供筛选器字符串和用于使用筛选器触发重新加载的按钮。

首先将以下代码添加到 @code 组件 (Index) 的 MoviePages/Index.razor 块:

[SupplyParameterFromQuery]
private string? TitleFilter { get; set; }

private IQueryable<Movie> FilteredMovies => 
    context.Movie.Where(m => m.Title!.Contains(TitleFilter ?? string.Empty));

TitleFilter 是筛选器字符串。 为该属性提供 [SupplyParameterFromQuery] 特性,告知 Blazor 当查询字符串包含同名字段(例如,TitleFilter 生成 ?titleFilter=road+warriorTitleFilter 值)时,应从查询字符串中分配 road warrior 的值。 请注意,查询字符串字段名称(例如 titleFilter)不区分大小写。

FilteredMovies 属性是一个 IQueryable<Movie>,是分配给 QuickGrid 的 Items 参数的类型。 该属性根据提供的 TitleFilter 筛选电影列表。 如果未从查询字符串(TitleFilterTitleFilter)中为 null 分配一个值,则 string.Empty 子句使用空字符串 (Contains)。 因此,不会筛选显示任何电影。

更改 QuickGrid 组件的 Items 参数以使用 movies 集合:

- <QuickGrid Class="table" Items="context.Movie">
+ <QuickGrid Class="table" Items="FilteredMovies">

movie => movie.Title!.Contains(...) 代码是一个 Lambda 表达式。 Lambda 在基于方法的 LINQ 查询中用作标准查询运算符方法(如 Where 方法或 Contains 方法)的参数。 在对 LINQ 查询进行定义或通过调用方法(如 WhereContainsOrderBy)进行修改后,不会执行此查询。 相反,会延迟执行查询。 表达式的计算会延迟,直到循环访问其实现的值为止。

Contains 方法在数据库中运行,而不是在 C# 代码中运行。 查询是否区分大小写取决于数据库和排序规则。 对于 SQL Server,Contains 映射到 SQL LIKE,这是不区分大小写的。 具有默认排序规则的 SQLite 是区分大小写和不区分大小写的混合,具体取决于查询。 有关进行不区分大小写的 SQLite 查询的信息,请参阅本文的“其他资源”部分。

运行应用并导航到在 Index 的电影 /movies 页。 数据库加载中的电影:

在电影“索引”页中筛选之前的 Mad Max 电影

将查询字符串追加到地址栏中的 URL:?titleFilter=road+warrior。 例如,如果端口号为 https://localhost:7073/movies?titleFilter=road+warrior,则完整 URL 显示为 7073。 将显示筛选后的电影:

在浏览器的地址栏中使用查询字符串筛选的“The Road Warrior”Mad Max 电影。

接下来,为用户提供一种通过组件 UI 提供 titleFilter 筛选器字符串的方法。 在 H1 标题 (<h1>Index</h1>) 下添加以下 HTML。 以下 HTML 以查询字符串值的形式重新加载包含文本框内容的页面:

<div>
    <form action="/movies" data-enhance>
        <input type="search" name="titleFilter" />
        <input type="submit" value="Search" />
    </form>
</div>

data-enhance 特性将增强型导航应用于组件,其中 Blazor 截获 GET 请求并改为执行提取请求。 然后,Blazor 将响应内容修补到页面中,避免全页重载并保留更多页面状态。 页面加载速度更快,通常不会丢失用户的滚动位置。

保存正在处理的文件。 通过重启应用或使用“热重载”将更改应用到正在运行的应用来应用更改。

关闭浏览器窗口,在 VS Code 中选择“运行>重启调试”或按键盘上的 Ctrl+Shift+F5。 VS Code 使用保存的更改重新编译并运行应用,并为应用生成新的浏览器窗口。

由于应用当前正在使用 dotnet watch 运行,因此会自动检测保存的更改,并反映在现有浏览器窗口中。

在搜索框中键入“road warrior”,然后选择用于筛选电影的 Search 按钮:

在电影“索引”页中筛选之前的 Mad Max 电影。搜索字段包含值“road warrior”。

搜索 road warrior 后的结果:

通过 HTML 表单操作,使用 GET 请求筛选的“The Road Warrior”Mad Max 电影。

请注意,筛选电影时,搜索框会丢失搜索值 (“road warrior”)。 如果要保留搜索的值,请添加 data-permanent 特性:

- <form action="/movies" data-enhance>
+ <form action="/movies" data-enhance data-permanent>

停止应用

通过关闭浏览器的窗口来停止应用。

通过关闭浏览器的窗口并在 VS Code 中按键盘上的 Shift+F5 来停止应用。

通过在命令行界面中关闭浏览器的窗口并 按 Ctrl+C 来停止应用。

用完成的示例排除故障

如果在学习本教程时遇到无法从文本中解决的问题,请将代码与 Blazor 示例存储库中已完成的项目进行比较:

Blazor 示例 GitHub 存储库 (dotnet/blazor-samples)

选择最新版本文件夹。 本教程项目的示例文件夹命名为 BlazorWebAppMovies

其他资源

Mad MaxThe Road WarriorMad Max: Beyond ThunderdomeMad Max: Fury RoadFuriosa: A Mad Max SagaWarner Bros. Entertainment 的商标和版权。

后续步骤