ASP.NET Core MVC 3.1:传递搜索过滤结果至锚点生成对应PDF
ASP.NET Core MVC 3.1:将搜索值传递到PDF生成接口
问题描述
我有一个展示电影列表的Index视图,已添加搜索文本框,想了解是否有办法将搜索值传递到锚点元素中。该锚点指向一个生成PDF视图的Action,希望传递搜索输入以便基于该输入查询,生成不同的PDF结果。
原始代码
Movies控制器代码
// GET: Movies public async Task<IActionResult> Index(string search) { var movies = _context.Movies.Include(m => m.Genre).OrderBy(m=>m.Name); if (!string.IsNullOrEmpty(search)) { var query = _context.Movies.Include(m => m.Genre); var searchedItems = query.Where(m => m.Name.Contains(search) || m.Genre.Name.Contains(search) || m.Year.ToString().Contains(search)); return View(await searchedItems.ToListAsync()); } return View( await movies.ToListAsync()); } public IActionResult GeneratePdf(string linkedSearch) { var movies = _context.Movies.Include(m => m.Genre).OrderBy(m => m.Name).ToList(); return new ViewAsPdf("GeneratePdf", movies) { PageOrientation = Rotativa.AspNetCore.Options.Orientation.Portrait, PageSize = Rotativa.AspNetCore.Options.Size.A4 }; }
Index.cshtml视图代码
@model IEnumerable<MovieListApp.Models.Movie> @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-action="Create">添加新电影</a> </p> <a asp-action="Index">刷新</a> @* 表格内容省略 *@ <form asp-action="Index" asp-controller="Movies" method="get"> <p> 搜索:<input type="text" name="search" placeholder="名称、类型、年份" /> <input type="submit" value="筛选" /> </p> </form> <a asp-action="GeneratePdf" asp-controller="Movies">生成PDF</a>
解决方案(基于Rotativa 1.2)
修改后的Movies控制器代码
// GET: Movies public async Task<IActionResult> Index(string search) { ViewData["Search"] = search; var movies = _context.Movies.Include(m => m.Genre).OrderBy(m=>m.Name); if (!string.IsNullOrEmpty(search)) { var query = _context.Movies.Include(m => m.Genre); var searchedItems = query.Where(m => m.Name.Contains(search) || m.Genre.Name.Contains(search) || m.Year.ToString().Contains(search)); return View(await searchedItems.ToListAsync()); } return View( await movies.ToListAsync()); } public async Task<IActionResult> GeneratePdf(string linkedSearch) { var movies = _context.Movies.Include(m => m.Genre).OrderBy(m => m.Name); if (!string.IsNullOrEmpty(linkedSearch)) { var query = _context.Movies.Include(m => m.Genre); var searchedItems = query.Where(m => m.Name.Contains(linkedSearch) || m.Genre.Name.Contains(linkedSearch) || m.Year.ToString().Contains(linkedSearch)); return new ViewAsPdf("GeneratePdf",await searchedItems.ToListAsync()) { PageOrientation = Rotativa.AspNetCore.Options.Orientation.Portrait, PageSize = Rotativa.AspNetCore.Options.Size.A4 }; } return new ViewAsPdf("GeneratePdf", await movies.ToListAsync()) { PageOrientation = Rotativa.AspNetCore.Options.Orientation.Portrait, PageSize = Rotativa.AspNetCore.Options.Size.A4 }; }
修改后的Index.cshtml视图代码
@model IEnumerable<MovieListApp.Models.Movie> @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-action="Create">添加新电影</a> </p> <a asp-action="Index">刷新</a> <form asp-action="Index" asp-controller="Movies" method="get"> <p> 搜索:<input type="text" name="search" placeholder="名称、类型、年份" /> <input type="submit" value="筛选" /> </p> </form> @{ <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Name) </th> <th> @Html.DisplayNameFor(model => model.Year) </th> <th> @Html.DisplayNameFor(model => model.Rating) </th> <th> <label>类型</label>> </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Name) </td> <td> @Html.DisplayFor(modelItem => item.Year) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> @Html.DisplayFor(modelItem => item.Genre.Name) </td> <td> <a asp-action="Edit" asp-route-id="@item.MovieId">编辑</a> | <a asp-action="Details" asp-route-id="@item.MovieId">详情</a> | <a asp-action="Delete" asp-route-id="@item.MovieId">删除</a> </td> </tr> } </tbody> </table> } <a asp-action="GeneratePdf" asp-controller="Movies" asp-route-linkedSearch="@ViewData["Search"]">生成PDF</a>
效果说明
修改后,点击「生成PDF」时会自动携带当前的搜索参数,生成对应筛选结果的PDF文件,支持不同搜索条件生成不同内容的PDF。
内容的提问来源于stack exchange,提问作者Anheru Desu
相关产品推荐
相关产品推荐

