Michal回答了你第一个问题。关于你的第二个问题,你可以使用第三方的标签佣工像pioneer-pagination
或写你自己的实现分页逻辑的观点像下面(主要是基于official documentation),不是完美的一个实现分页,但仍在工作:
模型页:
public class PageViewModel
{
public int PageNumber { get; }
public int TotalPages { get; }
public PageViewModel(int count, int pageNumber, int pageSize)
{
PageNumber = pageNumber;
TotalPages = (int)Math.Ceiling(count/(double)pageSize);
}
public bool HasPreviousPage => (PageNumber > 1);
public bool HasNextPage => (PageNumber < TotalPages);
}
代码标签帮手:
public class PagerTagHelper : TagHelper
{
private IUrlHelperFactory urlHelperFactory;
public PagerTagHelper(IUrlHelperFactory helperFactory)
{
urlHelperFactory = helperFactory;
}
[ViewContext]
[HtmlAttributeNotBound]
public ViewContext ViewContext { get; set; }
public PageViewModel PageModel { get; set; }
public string PageAction { get; set; }
public string PageController { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
IUrlHelper urlHelper = urlHelperFactory.GetUrlHelper(ViewContext);
output.TagName = "div";
// we put our links in list
TagBuilder tag = new TagBuilder("ul");
tag.AddCssClass("pagination");
//show link for 1st page
if (PageModel.PageNumber>2)
{
TagBuilder fstItem = CreateTag(1, urlHelper);
tag.InnerHtml.AppendHtml(fstItem);
}
// create 3 links to current, next and previous page.
TagBuilder currentItem = CreateTag(PageModel.PageNumber, urlHelper);
// link to previous page if NOT 1st page
if (PageModel.HasPreviousPage)
{
TagBuilder prevItem = CreateTag(PageModel.PageNumber - 1, urlHelper);
tag.InnerHtml.AppendHtml(prevItem);
}
tag.InnerHtml.AppendHtml(currentItem);
// link to next page, if NOT last page
if (PageModel.HasNextPage)
{
TagBuilder nextItem = CreateTag(PageModel.PageNumber + 1, urlHelper);
tag.InnerHtml.AppendHtml(nextItem);
}
//show code for last page
if (PageModel.TotalPages > 4 && PageModel.PageNumber!=PageModel.TotalPages-1 && PageModel.HasNextPage)
{
TagBuilder lstItem = CreateTag(PageModel.TotalPages, urlHelper);
tag.InnerHtml.AppendHtml(lstItem);
}
output.Content.AppendHtml(tag);
}
TagBuilder CreateTag(int pageNumber, IUrlHelper urlHelper)
{
TagBuilder item = new TagBuilder("li");
TagBuilder link = new TagBuilder("a");
if (pageNumber == this.PageModel.PageNumber)
{
item.AddCssClass("active");
}
else
{
link.Attributes["href"] = urlHelper.Action(PageAction, PageController, new { page = pageNumber });
}
link.InnerHtml.Append(pageNumber.ToString());
item.InnerHtml.AppendHtml(link);
return item;
}
}
并且鉴于喜欢使用它(不要忘了进口标签帮手_ViewImports.cshtml):
<pager page-model="@Model.PageViewModel" page-action="Index" page-controller="Home"></pager>
和代码控制器:
public async Task<IActionResult> Index(int page=1)
{
int pageSize = 10;
var count = await _context.Agent.CountAsync();
var items = await _context.Agent.Skip((page - 1) * pageSize).Take(pageSize).ToListAsync();
PageViewModel pageVm= new PageViewModel(count, page, pageSize);
IndexViewModel vm= new IndexViewModel
{
PageViewModel = pageVm,
Agents =items // need to create table in view from Agent properties
};
return View(vm);
}
和代码的IndexViewModel:
public class IndexViewModel
{
public IEnumerable<Agent> Agents { get; set; }
public PageViewModel PageViewModel { get; set; }
}
更新: 如果你想显示在你看来,你可以只是标签助手for循环像下面Process
方法都PageLinks:
public override void Process(TagHelperContext context, TagHelperOutput output)
{
IUrlHelper urlHelper = urlHelperFactory.GetUrlHelper(ViewContext);
output.TagName = "div";
// we put our links in list
TagBuilder tag = new TagBuilder("ul");
tag.AddCssClass("pagination");
for (int i = 1; i <= PageModel.TotalPages; i++)
{
TagBuilder linkItem = CreateTag(i, urlHelper);
tag.InnerHtml.AppendHtml(linkItem);
}
output.Content.AppendHtml(tag);
}
更新2:
为了使用这种方法,不要忘记将索引页面的模型更改为IndexViewModel
,并在_ViewImports.cshtml中注册标签助手。我的工作观点(简化)看起来像这样。
@* Using and tag helper imported in _ViewImports.cshtml *@
@model IndexViewModel
@{
ViewData["Title"] = "Home";
}
<div>
<table class="table">
<tr><th>Name</th><th>Age</th></tr>
@foreach (var a in Model.Agents)
{
<tr><td>@a.Name</td><td>@a.Age</td></tr>
}
</table>
</div>
<pager page-model="@Model.PageViewModel" page-action="Index" page-controller="Home"></pager>
更新3:
- 如果你使用
IndexViewModel
像我上面写的,但在我的例子不使用的foreach一样,你应该改变@Html.DisplayNameFor(model => model.Name)
到@Html.DisplayNameFor(model => model.Agents.Name)
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
进口只内置ASP.NET Core标签助手。为了导入自定义标签,您应该使用@addTagHelper *, YourAssemblyName
,其中YourAssemblyName
是您项目的名称(例如'AgentApp`),请参阅A minimal Tag Helper section in documentation以获取更多信息。
看起来像你正在使用'asp.net core'。相应地标记 – Rahul
@Rahul Yup,固定。 – sagi