for循环没有返回预期值 - C# - Blazor

问题描述 投票:2回答:1

使用Blazor,我正在为我的项目创建一个分页功能。主要概念是使用linq的.Skip()和.Take(),我只会从列表中单击页面的列表项。

创建分页按钮的代码:(E.G:1,2,3)

<ul class="pagination float-center">
  @for (int i = 0; i < Math.Ceiling((decimal)articleService.ReturnAll().Count() / numPerPage); i++)
    {
      <li class="page-item"><a class="page-link" onclick="@(() => ReturnPage(i))">@i</a></li>
    }
</ul>

我很喜欢在这里使用0索引作为我的分页。

上面的代码创建了按下按钮(比如第1页的第1页),传递for循环的索引,我将稍后乘以每页的数量,以获得列表中要跳过的元素数量。

例如,当点击第1页时,我需要跳过列表中的2个元素,然后选择下一个2.(假设我想要2个项目作为每页的数量)

然后我的ReturnPage函数将跳过当前页面(点击什么) - 1,然后乘以2(或每页的数量)以找到要跳过的总金额。如果用户单击0(第一页),那么我需要.Skip(0)和.Take(每页数量)。

void ReturnPage(int i)
 {

    articles = articleService.ReturnAll()
                                .OrderByDescending(x => x.LastUpdated)
                                    .Skip((i == 0) ? 0 : (i - 1) == 0 ? numPerPage : (i - 1) * numPerPage)
                                        .Take(numPerPage)
                                            .ToList();
 }

如果我有一个项目总数为3的列表(文章),则将其置于上下文中。这将返回0,1的分页按钮。第0页将显示2个项目,第1页将显示1个项目。

如果我单击分页按钮1,我应该将1(i)传递给ReturnPage方法,这将计算2个项目的跳过量。这意味着这个页面将跳过列表中的前2项,然后选择下一个2.(在这种情况下只有1项)

如果我单击返回分页按钮0,我应该传递i值为0,不跳过任何内容,并且只取前2项。

但是我没有看到正确的(i)值被传递到ReturnPage函数中。

运行我上面概述的相同示例,for循环返回正确数量的按钮:Pagination Buttons

但是在调试时,我的值为2(每次?)。这会抛弃整个.Skip()功能。

Wrong Expected Value

我的解释是,完全无视linq的东西,for循环中的某些东西是错误的。这种情况对我来说似乎是对的。如果我有每页3和2的计数,这是1.5,这意味着2页。所以我的i值应该是0和1,但不知何故它的2?

我必须在这里缺少一些基本的东西,任何想法?

c# for-loop blazor
1个回答
2
投票

你的for循环应该包含一个这样的局部变量:

 @for (int i = 0; i < Math.Ceiling((decimal)articleService.ReturnAll().Count() / numPerPage); i++)
    {
       var localVariable = i;

      <li class="page-item"><a class="page-link" onclick="@(() => ReturnPage(localVariable ))">@i</a></li>
    }

这是标准的C#行为,其中lambda表达式@(()=> ReturnPage(localVariable))可以访问变量而不能访问变量的值。你必须定义一个for循环的本地变量,否则你的lambda表达式将始终调用ReturnPage(i)并且我等于Math.Ceiling((decimal)articleService.ReturnAll()。循环结束时的Count() 。

© www.soinside.com 2019 - 2024. All rights reserved.