Background code:
public async Task<IActionResult> Index(int? page,string search)
{
var applicationDbContext = _context.Blogs.Include(b => b.Context).Include(b => b.Owner).Include(b => b.Type).OrderByDescending(x=>x.PublishTime);
if (search != null)
{
var products = applicationDbContext.Where(x => x.Title.Contains(search)); //returns IQueryable<Product> representing an unknown number of products. a thousand maybe?
var pageNumber = page ?? 1; // if no page was specified in the querystring, default to the first page (1)
var onePageOfProducts = products.ToPagedList(pageNumber, 10); // will only contain 10 products max because of the pageSize
ViewBag.OnePageOfProducts = onePageOfProducts;
return View(await onePageOfProducts.ToListAsync());
}
else
{
var products = applicationDbContext; //returns IQueryable<Product> representing an unknown number of products. a thousand maybe?
var pageNumber = page ?? 1; // if no page was specified in the querystring, default to the first page (1)
var onePageOfProducts = products.ToPagedList(pageNumber, 10); // will only contain 10 products max because of the pageSize
ViewBag.OnePageOfProducts = onePageOfProducts;
return View(await onePageOfProducts.ToListAsync());
}
}
Razor page code:
@model IEnumerable<BlogPlatform.Models.Blog>
@using X.PagedList.Mvc.Core;
@using X.PagedList;
<form action="~/Blogs/Index" method="post">
<p>
Title: <input type="text" name="search" />
<input type="submit" value="search" />
</p>
</form>
……
@foreach (var item in Model)
{
……
}
@Html.PagedListPager((IPagedList)ViewBag.OnePageOfProducts, page => Url.Action("Index", new { page }))
Let me first try to explain the background C# code:
This is a typical rewritten method.
Its initial version should look like this:
public async Task<IActionResult> Index()
{
return View(await _context.Users.ToListAsync());
}
Why does the rewritten code become so complicated?
Because it not only has a paging function, it also comes with a search function.
Every time Index is opened, it will request the else part first. The first thing is to get the data context, and then see if there is a page parameter, if not, the result of the first page will be displayed by default.
Then, you may see the core part:
var onePageOfProducts = products.ToPagedList(pageNumber, 10); // will only contain 10 products max because of the pageSize
ViewBag.OnePageOfProducts = onePageOfProducts;
return View(await onePageOfProducts.ToListAsync());
It corresponds to the last line of the razor page I mentioned above:
@Html.PagedListPager((IPagedList)ViewBag.OnePageOfProducts, page => Url.Action("Index", new { page }))
So, we can extract the core, the part you should modify is:
@Html.PagedListPager({Your ViewBag}, page => Url.Action("Index", new {page}))
In this way, you have completed the paging function and the search function.
But there is another problem, that is, the paging function after the search is not completed. I leave this task to you to figure out how to do it, because it is better to teach people how to fish.
Today's comments have reached the limit. If you want to comment, please wait until tomorrow (UTC-Time).
There is 20h02m33s left until you can comment.