Blazor 组件分页
Blazor Component paging
我正在开发 Blazor 应用程序并有一个显示记录列表的组件(从 entity framework 实体检索),想知道在组件上实现分页的最佳和最简单方法。
如有任何帮助,我们将不胜感激。
在 Blazor 中,您可以完全控制 DOM。由于您使用的是 EF,因此您可以简单地执行 Skip and Take 进行分页:
private int pageSize = 100;
private int pageNumber = 1;
在 HTML 中:
for(int p = 1; p<= list.Count() / pageSize ; p++) {
<button type="button" @onclick="(e=>HandleChangePage(p))">@p</button>
}
处理更改页面:
void HandleChangePage(int p) {
pageNumber = p;
var page = list.Skip((p-1) * pageSize).Take(pageSize);
}
这是最简单的分页方式,
现在您可以继续创建分页列表组件
现在您需要将列表作为参数传递给组件
[Parameter]
public List<ClassName> list {get;set;}
如果您想使用通用列表,请查看 Template context parameters
在 Blazor 中,您可以像在 MVC 中一样传递页面。
对于一个非常简单的示例,对 FetchData.razor 进行以下更改:
@page "/fetchdata"
@page "/fetchdata/{PageNumber:int}"
... the HTML for the table...
<div>
@for (int i = 1; i <= 5; i++)
{
<span><a href="fetchdata/@i"> @i </a>|</span>
}
</div>
@code {
[Parameter]
public int PageNumber { get; set; }
private WeatherForecast[] forecasts;
protected override async Task OnParametersSetAsync()
{
if (PageNumber < 1) PageNumber = 1;
// adapt the service to take pageIndex, pageSize
forecasts = await ForecastService.GetForecastAsync(PageNumber-1, 5);
}
}
分页器非常粗糙,只有 1 .. 5。有可用的组件可以完成大部分标记和逻辑,google for "Blazor Pager component"。我很快就找到了 this one。
我开发了一个通用分页组件,它使用 HTML table 并且很容易重用。将其保存在它自己的名为 PagedList.razor:
的组件 razor 中
@typeparam TItem
@if (!ListQuery.Any())
{
<div class="none-indicator">(none)</div>
}
else
{
@if (TotalPages() > 1)
{
<div class="pager-display">
@if (CurrentPage == 1)
{
<button disabled>«</button>
<button disabled>‹</button>
}
else
{
<button @onclick="@MoveFirst" title="Move First">«</button>
<button @onclick="@MoveBack" title="Move Back">‹</button>
}
<span>@CurrentPage of @TotalPages() </span>
@if (!AtLastPage())
{
<button @onclick="@MoveNext" title="Move Next">›</button>
<button @onclick="@MoveLast" title="Move Last">»</button>
}
else
{
<button disabled>›</button>
<button disabled>»</button>
}
</div>
}
<table class="table table-striped">
<thead>
@HeaderDisplay
</thead>
<tbody>
@foreach (TItem item in CurrentDisplay)
{
@ItemDisplay(item)
}
</tbody>
</table>
}
@code {
[Parameter]
public IQueryable<TItem> ListQuery { get; set; }
[Parameter]
public RenderFragment HeaderDisplay { get; set; }
[Parameter]
public RenderFragment<TItem> ItemDisplay { get; set; }
[Parameter]
public int ItemsPerPage { get; set; } = 10;
private int CurrentPage = 1;
private List<TItem> CurrentDisplay;
private int TotalCount;
protected override void OnParametersSet()
{
UpdateDisplay();
TotalCount = ListQuery.Count();
}
private void UpdateDisplay()
{
CurrentDisplay = ListQuery.Skip((CurrentPage - 1) * ItemsPerPage).Take(ItemsPerPage).ToList();
}
private bool AtLastPage()
{
return CurrentPage >= TotalPages();
}
private int TotalPages()
{
return Convert.ToInt32(Math.Ceiling(TotalCount / Convert.ToDecimal(ItemsPerPage)));
}
private void MoveFirst()
{
CurrentPage = 1;
UpdateDisplay();
}
private void MoveBack()
{
CurrentPage--;
UpdateDisplay();
}
private void MoveNext()
{
CurrentPage++;
UpdateDisplay();
}
private void MoveLast()
{
CurrentPage = TotalPages();
UpdateDisplay();
}
}
这是一个使用示例:
<PagedList ListQuery="People">
<HeaderDisplay>
<tr>
<th></th>
<th>First Name</th>
<th>Last Name</th>
<th>Title</th>
</tr>
</HeaderDisplay>
<ItemDisplay>
<tr>
<td><a href="People/Edit/@(context.ID)">Edit</a></td>
<td>@context.FirstName</td>
<td>@context.LastName</td>
<td>@context.Title</td>
</tr>
</ItemDisplay>
</PagedList>
@code {
private IQueryable<Person> People;
protected override void OnInitialized()
{
People = DatabaseContext.Person.Where(p => ...)
}
}
我正在开发 Blazor 应用程序并有一个显示记录列表的组件(从 entity framework 实体检索),想知道在组件上实现分页的最佳和最简单方法。
如有任何帮助,我们将不胜感激。
在 Blazor 中,您可以完全控制 DOM。由于您使用的是 EF,因此您可以简单地执行 Skip and Take 进行分页:
private int pageSize = 100;
private int pageNumber = 1;
在 HTML 中:
for(int p = 1; p<= list.Count() / pageSize ; p++) {
<button type="button" @onclick="(e=>HandleChangePage(p))">@p</button>
}
处理更改页面:
void HandleChangePage(int p) {
pageNumber = p;
var page = list.Skip((p-1) * pageSize).Take(pageSize);
}
这是最简单的分页方式,
现在您可以继续创建分页列表组件
现在您需要将列表作为参数传递给组件
[Parameter]
public List<ClassName> list {get;set;}
如果您想使用通用列表,请查看 Template context parameters
在 Blazor 中,您可以像在 MVC 中一样传递页面。
对于一个非常简单的示例,对 FetchData.razor 进行以下更改:
@page "/fetchdata"
@page "/fetchdata/{PageNumber:int}"
... the HTML for the table...
<div>
@for (int i = 1; i <= 5; i++)
{
<span><a href="fetchdata/@i"> @i </a>|</span>
}
</div>
@code {
[Parameter]
public int PageNumber { get; set; }
private WeatherForecast[] forecasts;
protected override async Task OnParametersSetAsync()
{
if (PageNumber < 1) PageNumber = 1;
// adapt the service to take pageIndex, pageSize
forecasts = await ForecastService.GetForecastAsync(PageNumber-1, 5);
}
}
分页器非常粗糙,只有 1 .. 5。有可用的组件可以完成大部分标记和逻辑,google for "Blazor Pager component"。我很快就找到了 this one。
我开发了一个通用分页组件,它使用 HTML table 并且很容易重用。将其保存在它自己的名为 PagedList.razor:
的组件 razor 中@typeparam TItem
@if (!ListQuery.Any())
{
<div class="none-indicator">(none)</div>
}
else
{
@if (TotalPages() > 1)
{
<div class="pager-display">
@if (CurrentPage == 1)
{
<button disabled>«</button>
<button disabled>‹</button>
}
else
{
<button @onclick="@MoveFirst" title="Move First">«</button>
<button @onclick="@MoveBack" title="Move Back">‹</button>
}
<span>@CurrentPage of @TotalPages() </span>
@if (!AtLastPage())
{
<button @onclick="@MoveNext" title="Move Next">›</button>
<button @onclick="@MoveLast" title="Move Last">»</button>
}
else
{
<button disabled>›</button>
<button disabled>»</button>
}
</div>
}
<table class="table table-striped">
<thead>
@HeaderDisplay
</thead>
<tbody>
@foreach (TItem item in CurrentDisplay)
{
@ItemDisplay(item)
}
</tbody>
</table>
}
@code {
[Parameter]
public IQueryable<TItem> ListQuery { get; set; }
[Parameter]
public RenderFragment HeaderDisplay { get; set; }
[Parameter]
public RenderFragment<TItem> ItemDisplay { get; set; }
[Parameter]
public int ItemsPerPage { get; set; } = 10;
private int CurrentPage = 1;
private List<TItem> CurrentDisplay;
private int TotalCount;
protected override void OnParametersSet()
{
UpdateDisplay();
TotalCount = ListQuery.Count();
}
private void UpdateDisplay()
{
CurrentDisplay = ListQuery.Skip((CurrentPage - 1) * ItemsPerPage).Take(ItemsPerPage).ToList();
}
private bool AtLastPage()
{
return CurrentPage >= TotalPages();
}
private int TotalPages()
{
return Convert.ToInt32(Math.Ceiling(TotalCount / Convert.ToDecimal(ItemsPerPage)));
}
private void MoveFirst()
{
CurrentPage = 1;
UpdateDisplay();
}
private void MoveBack()
{
CurrentPage--;
UpdateDisplay();
}
private void MoveNext()
{
CurrentPage++;
UpdateDisplay();
}
private void MoveLast()
{
CurrentPage = TotalPages();
UpdateDisplay();
}
}
这是一个使用示例:
<PagedList ListQuery="People">
<HeaderDisplay>
<tr>
<th></th>
<th>First Name</th>
<th>Last Name</th>
<th>Title</th>
</tr>
</HeaderDisplay>
<ItemDisplay>
<tr>
<td><a href="People/Edit/@(context.ID)">Edit</a></td>
<td>@context.FirstName</td>
<td>@context.LastName</td>
<td>@context.Title</td>
</tr>
</ItemDisplay>
</PagedList>
@code {
private IQueryable<Person> People;
protected override void OnInitialized()
{
People = DatabaseContext.Person.Where(p => ...)
}
}