Michal回答了你的第一个问题。关于你的第二个问题,你可以使用第三方标签助手,例如pioneer-pagination
或者像下面这样为视图编写自己的分页逻辑实现(主要基于官方文档),这不是完美的分页实现,但仍然有效:
分页模型:
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);
}
tag helper的代码:
public class PagerTagHelper : TagHelper
[ViewContext]
[HtmlAttributeNotBound]
public ViewContext ViewContext
public PageViewModel PageModel
public string PageAction
public string PageController
public override void Process(TagHelperContext context, TagHelperOutput output)
TagBuilder currentItem = CreateTag(PageModel.PageNumber, urlHelper);
if (PageModel.HasPreviousPage)
tag.InnerHtml.AppendHtml(currentItem);
if (PageModel.HasNextPage)
if (PageModel.TotalPages > 4 && PageModel.PageNumber!=PageModel.TotalPages-1 && PageModel.HasNextPage)
output.Content.AppendHtml(tag);
}
TagBuilder CreateTag(int pageNumber, IUrlHelper urlHelper)
else
);
}
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
};
return View(vm);
}
以下是IndexViewModel的代码:
public class IndexViewModel
{
public IEnumerable<Agent> Agents { get; set; }
public PageViewModel PageViewModel { get; set; }
}
更新:
如果你想在视图中显示所有的 PageLinks,你可以像下面这样在 Tag Helper 的
Process
方法中使用 for 循环:
public override void Process(TagHelperContext context, TagHelperOutput output)
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'),请参见文档中的最小标签帮助器部分以获取更多信息。
asp.net core
。请相应地打标签。 - Rahul