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 查询进行定义或通过调用方法(如 WhereContains 或 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>

通过按流派或/和电影标题搜索来测试应用。

ASP.NET CORE RAZOR :将搜索添加到 Razor 页面应用的更多相关文章

  1. ASP.NET Core错误处理中间件[2]: 开发者异常页面

    <呈现错误信息>通过几个简单的实例演示了如何呈现一个错误页面,该过程由3个对应的中间件来完成.下面先介绍用来呈现开发者异常页面的DeveloperExceptionPageMiddlewa ...

  2. Do You Kown Asp.Net Core - 根据实体类自动创建Razor Page CURD页面模板

    Scaffolding Template Intro 我们知道在Asp.Net MVC中,如果你使用的EF的DBContext的话,你可以在vs中通过右键解决方案-添加控制器-添加包含视图的控制器,然 ...

  3. 学习ASP.NET Core(08)-过滤搜索与分页排序

    上一篇我们介绍了AOP的基本概览,并使用动态代理的方式添加了服务日志:本章我们将介绍过滤与搜索.分页与排序并添加对应的功能 注:本章内容大多是基于solenovex的使用 ASP.NET Core 3 ...

  4. ASP.NET Core 5.0 MVC中的 Razor 页面 介绍

    Razor 是一个用于将基于服务器的代码嵌入到网页中的标记语法. Razor语法由 Razor 标记.c # 和 HTML 组成. 通常包含 Razor 的文件的扩展名 cshtml Razor 语法 ...

  5. 使用Asp.Net Core Identity给用户添加及删除角色

    基于Asp.Net Core编制一个项目,需要给用户添加及删除角色的功能,于是使用到了Identity中的UserManager. 先后解决了几个问题,终于实现了设想. 1. 环境条件 Asp.Net ...

  6. ASP.NET Core教程【一】关于Razor Page的知识

    关键文件和目录结构 按照asp.net core WEB应用程序向导,创建一个工程之后 你会发现如下几个目录和文件 wwwroot:放置网站的静态文件的目录 Pages:放置razor页面的目录 ap ...

  7. 如何在 asp.net core 的中间件中返回具体的页面

    前言 在 asp.net core 中,存在着中间件这一概念,在中间件中,我们可以比过滤器更早的介入到 http 请求管道,从而实现对每一次的 http 请求.响应做切面处理,从而实现一些特殊的功能 ...

  8. 【Asp.Net Core】二、添加控制器和视图

    控制器Controller 在添加控制器前,我们先看下它为我们自动生成的一些Controller,我们看下AccountController.cs 来看下登录验证方法Login async这个应该是异 ...

  9. ASP.NET CORE 2.1无法添加控制器、视图

    常规操作:右键Controllers,添加控制器 结果提示:运行所选代码生成器时出错 在控制器里快速添加视图也得到同样的错误提示 既然提示代码生成器了,对比了一下2.0和2.1的代码,发现2.1默认没 ...

随机推荐

  1. 远程服务器的SqlServer允许本地连接

    最近做项目都是直接在阿里云买的服务器,并且SqlServer也是安装好的.但是默认的时候,这个服务器上的SqlServer并不允许直接在本地的SqlServer客户端访问,尽管服务器有公网IP. 想要 ...

  2. Linux下配置APUE的编译环境

    APUE即Unix环境高级编程,本书中几乎所有的程序都包含一个apue.h的头文件,那如何配置这个apue.h呢? 1.我们可以在http://pan.baidu.com/s/1dDxmtbF中下载, ...

  3. 计蒜客 28317.Growling Gears-一元二次方程的顶点公式 (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 G)

    G. Growling Gears 传送门 此题为签到题,直接中学的数学知识点,一元二次方程的顶点公式(-b/2*a,(4*a*c-b*b)/4*a):直接就可以得到结果. 代码: #include& ...

  4. Wannafly挑战赛4 A解方程【二分/set/hash求解方程】

    https://www.nowcoder.com/acm/contest/35/A 题目描述 给出n个整数和x,请问这n个整数中是否存在三个数a,b,c使得ax2+bx+c=0,数字可以重复使用. 输 ...

  5. Python的扩展接口[2] -> 动态链接库DLL[1] -> 组件对象模型 COM 的 Python 调用

    组件对象模型 COM 的 Python 调用 关于COM的基本概念,可参考组件对象模型 COM的内容,下面主要介绍两种使用 Python 调用 COM 组件的方法. 1 使用 win32com 1.1 ...

  6. Python实现微信小程序支付功能

    由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 当然具体的参数配置可以参考官 ...

  7. Google Kickstart Round E 2018 B. Milk Tea

    太蠢了,,,因为初始化大数据没过,丢了10分,纪念一下这个错误 大概思路:先求出让损失值最小的排列,由已生成的这些排列,通过更改某一个位置的值,生成下一个最优解,迭代最多生成m+1个最优解即可,遍历求 ...

  8. HNOI2004 郁闷的出纳员(Splay)

    郁闷的出纳员 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的 ...

  9. 求int最大值以及int二进制

    求int最大值:(((unsigned int)(~0))>>1) 求int的2进制串 string str = ""; int iNum = 100; for(int ...

  10. Android Handler 消息循环机制

    前言 一问起Android应用程序的入口,很多人会说是Activity中的onCreate方法,也有人说是ActivityThread中的静态main方法.因为Java虚拟机在运行的时候会自动加载指定 ...