Blazor应用循环中向ChangePages函数传值错误的问题求助
Blazor分页循环变量传递值错误的解决方法
你遇到的是Blazor中lambda表达式捕获循环变量的常见问题:@for循环里的lambda表达式绑定@onclick时,捕获的是循环变量i的引用,而非每次迭代的当前值,所以所有点击事件最终都会使用循环结束时i的最终值。
解决方法一:创建局部变量保存当前循环值
在循环内部新增一个局部变量,存储当前迭代的页码值,让lambda表达式捕获这个局部变量的副本:
<nav aria-label=""> <ul class="pagination"> ... @for (var i = PaginationInfo.StartNavigationPage; i <= PaginationInfo.StopNavigationPage; i++) { var currentPage = i; // 保存当前迭代的页码值 <li class="page-item" @onclick="(async () => ChangePages(currentPage))"> <a class="page-link @PaginationInfo.ClassByPageNumber(i)" href="/journal/@i">@i</a> </li> } ... </ul> </nav>
每次循环迭代时,currentPage会被赋值为当前i的副本,lambda表达式引用这个局部变量,点击时就能传递正确的页码。
解决方法二:使用@foreach循环替代@for循环
将页码范围转换为一个集合,通过@foreach循环遍历,foreach每次迭代会创建独立的变量,避免引用共享变量的问题:
<nav aria-label=""> <ul class="pagination"> ... @{ // 生成页码集合 var pageNumbers = Enumerable.Range( PaginationInfo.StartNavigationPage, PaginationInfo.StopNavigationPage - PaginationInfo.StartNavigationPage + 1 ); } @foreach (var page in pageNumbers) { <li class="page-item" @onclick="(async () => ChangePages(page))"> <a class="page-link @PaginationInfo.ClassByPageNumber(page)" href="/journal/@page">@page</a> </li> } ... </ul> </nav>
foreach循环中的page变量在每次迭代时都是新的实例,lambda表达式捕获的是当前迭代的page值,点击时即可传递正确页码。
内容的提问来源于stack exchange,提问作者3xGuy
相关产品推荐
相关产品推荐

