https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/search
本文档中,将向索引页面添加搜索功能以实现按“流派”或“名称”搜索电影。
使用以下代码更新Index页面的 OnGetAsync
方法:(注意是更新,而不是添加)
public async Task OnGetAsync(string searchString) { var movies = from m in _context.Movie select m; if (!String.IsNullOrEmpty(searchString)) { movies = movies.Where(s => s.Title.Contains(searchString)); } Movie = await movies.ToListAsync(); }
OnGetAsync
方法的第一行创建了 LINQ 查询用于选择电影:
var movies = from m in _context.Movie select m;
此时仅对查询进行了定义,它还不会针对数据库运行。
如果 searchString
参数包含一个字符串,电影查询则会被修改为根据搜索字符串进行筛选:
if (!String.IsNullOrEmpty(searchString)) { movies = movies.Where(s => s.Title.Contains(searchString)); }
s => s.Title.Contains()
代码是 Lambda 表达式。 Lambda 在基于方法的 LINQ 查询中用作标准查询运算符方法的参数,如 Where 方法或 Contains
(前面的代码中所使用的)。 在对 LINQ 查询进行定义或通过调用方法(如 Where
、Contains
或 OrderBy
)进行修改后,此查询不会被执行。 相反,会延迟执行查询。 这意味着表达式的计算会延迟,直到循环访问其实现的值或者调用 ToListAsync
方法为止。 有关详细信息,请参阅 Query Execution(查询执行)。
注意:Contains 方法在数据库中运行,而不是在 C# 代码中。 查询是否区分大小写取决于数据库和排序规则。 在 SQL Server 上,Contains
映射到 SQL LIKE,这是不区分大小写的。 在 SQLite 中,由于使用了默认排序规则,因此需要区分大小写。
导航到电影页面,并向 URL追加一个如 ?searchString=Ghost
的查询字符串(例如 http://localhost:5000/Movies?searchString=Ghost
)。 筛选的电影将显示出来。
如果向Index页面添加了以下路由模板,搜索字符串则可作为 URL 段传递(例如 http://localhost:5000/Movies/ghost
)。
@page "{searchString?}"
前面的路由约束允许按路由数据(URL 段)搜索标题,而不是按查询字符串值进行搜索。 "{searchString?}"
中的 ?
表示这是可选路由参数。
但是,不能指望用户修改 URL 来搜索电影。 在此步骤中,会添加 UI 来筛选电影。 如果已添加路由约束 "{searchString?}"
,请将它删除。
打开 Pages/Movies/Index.cshtml 文件,并添加以下代码中突出显示的 <form>
标记:
@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h2>Index</h2> <p> <a asp-page="Create">Create New</a> </p> <form> <p> Title: <input type="text" name="SearchString"> <input type="submit" value="Filter" /> </p> </form> <table class="table"> @*Markup removed for brevity.*@
HTML <form>
标记使用表单标记帮助程序。默认get方式提交表单。 提交表单时,筛选器字符串将发送到 Pages/Movies/Index 页面。 保存更改并测试筛选器。
按流派搜索
将以下突出显示的属性添加到 Pages/Movies/Index.cshtml.cs:
public class IndexModel : PageModel { private readonly RazorPagesMovie.Models.MovieContext _context; public IndexModel(RazorPagesMovie.Models.MovieContext context) { _context = context; } public List<Movie> Movie; public SelectList Genres;//引入命名空间 using Microsoft.AspNetCore.Mvc.Rendering; public string MovieGenre { get; set; }
SelectList Genres
包含流派列表。 这使用户能够从列表中选择一种流派。
MovieGenre
属性包含用户选择的特定流派(例如“西部”)。
使用以下代码更新 OnGetAsync
方法:
// Requires using Microsoft.AspNetCore.Mvc.Rendering; public async Task OnGetAsync(string movieGenre, string searchString) { // Use LINQ to get list of genres. IQueryable<string> genreQuery = from m in _context.Movie orderby m.Genre select m.Genre; var movies = from m in _context.Movie select m; if (!String.IsNullOrEmpty(searchString)) { movies = movies.Where(s => s.Title.Contains(searchString)); } if (!String.IsNullOrEmpty(movieGenre)) { movies = movies.Where(x => x.Genre == movieGenre); } Genres = new SelectList(await genreQuery.Distinct().ToListAsync()); Movie = await movies.ToListAsync(); }
下面的代码是一种 LINQ 查询,可从数据库中检索所有流派。
// Use LINQ to get list of genres. IQueryable<string> genreQuery = from m in _context.Movie orderby m.Genre select m.Genre;
流派的 SelectList
是通过投影截然不同的流派创建的。
Genres = new SelectList(await genreQuery.Distinct().ToListAsync());
添加“按流派搜索”
更新 Index.cshtml,如下所示:
@page @model RazorPagesMovie.Pages.Movies.IndexModel @{ ViewData["Title"] = "Index"; } <h2>Index</h2> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> Title: <input type="text" name="SearchString"> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead>
通过按流派或/和电影标题搜索来测试应用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统