zoukankan      html  css  js  c++  java
  • ASP.NET CORE RAZOR :将搜索添加到 Razor 页面应用

    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>

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

  • 相关阅读:
    基于Python自动生成小学四则运算题目的命令行程序(软工第二次作业)
    第一次个人编程作业
    自我介绍+软工五问
    如何清理 Docker 占用的磁盘空间
    复审与事后分析
    团队作业5——测试与发布(Alpha版本)
    项目冲刺总结集合贴
    团队作业3:需求改进&系统设计
    团队作业2——需求规格说明书
    团队作业1——团队展示&选题
  • 原文地址:https://www.cnblogs.com/djd66/p/8483137.html
Copyright © 2011-2022 走看看