You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor服务器端如何在组件渲染前传参?分页组件TotalRows初始为0问题

问题原因

你的问题由两个点共同导致:

  1. Blazor父组件执行异步生命周期方法OnInitializedAsync时,会先触发一次初始渲染,此时你还没从数据库拿到总行数,_total_rows为默认值0,分页组件先完成初始化。
  2. 你的Paginador组件仅在初始化阶段计算总页数_last_page,后续父组件更新TotalRows参数后,分页组件没有重新计算总页数,因此一直使用初始0值得到的错误结果。

解决方案

下面给出两种可行方案,推荐优先使用方案1:

方案1:修改分页组件适配参数更新

将分页组件的总页数计算逻辑从OnInitializedAsync移到OnParametersSet生命周期中,这样每次TotalRows参数更新时都会自动重新计算总页数:

// Paginador组件 @code 部分修改
protected override void OnParametersSet()
{
    // 总行数大于0时再计算总页数
    if (TotalRows > 0)
    {
        _last_page = (int)Math.Ceiling(decimal.Divide(TotalRows, Options.Value.RowsPerPage));
    }
}

该方案兼容性更好,不管后续总行数是否会动态变化,分页组件都能自动适配。

方案2:父组件延迟渲染分页组件

在父组件加判断,等拿到真实总行数后再渲染分页组件,这样分页组件第一次初始化时拿到的就是正确的TotalRows值:

<!-- 列表组件的分页区域修改 -->
<div class="row">
    @if (_total_rows > 0)
    {
        <Paginador TotalRows="_total_rows" OnPageChange="@GetPageAsync" />
    }
    <!-- 可选:加载提示 -->
    @* else
    {
        <span class="ms-2">加载中...</span>
    } *@
</div>

额外优化建议

你当前的GetPageAsync方法仅更新了列表数据,没有同步更新当前页码Page参数,用户刷新页面时会直接回到第一页,建议补充逻辑:

public async Task GetPageAsync(int page)
{
    Page = page;
    _personas = await _repo.ListarAsync(page);
}

内容的提问来源于stack exchange,提问作者Léster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:36:03