Blazor服务器端如何在组件渲染前传参?分页组件TotalRows初始为0问题
问题原因
你的问题由两个点共同导致:
- Blazor父组件执行异步生命周期方法
OnInitializedAsync时,会先触发一次初始渲染,此时你还没从数据库拿到总行数,_total_rows为默认值0,分页组件先完成初始化。 - 你的
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
相关产品推荐
相关产品推荐

