【问题标题】:blazor variable argument passing to onclick function [duplicate]传递给 onclick 函数的 blazor 变量参数 [重复]
【发布时间】:2019-10-18 21:39:14
【问题描述】:

我想将 int i 传递给每个列表项的按钮 onclick 函数。我预计“clickItem”函数将收到对应列表项的 0..2。但结果表明它总是接收 3 作为参数。似乎 clickItem(i) 中的变量 i 在 for 循环的渲染时没有被评估。我尝试将其更改为“clickItem(@i)”,但它仍然是一样的。我该怎么办? (我使用的是 blazor 服务器端,.net core 3 preview 5)

        @for (int i = 0; i < 3; i++)
        {
            <li> item @i <button onclick=@(() => clickItem(i))>Click</button> </li>
        }

【问题讨论】:

    标签: blazor blazor-server-side


    【解决方案1】:

    这是经典之作,但在 Blazor 的上下文中略显新。

    您需要进行复制,否则 lambda 会“捕获”循环变量。捕获副本是可以的。

    @for (int i = 0; i < 3; i++)
    {
        int copy = i;
        <li> item @i <button onclick=@(() => clickItem(copy))>Click</button> </li>
    }
    

    请注意,这是 for() 循环的问题,而不是 foreach() 的问题。

    【讨论】:

    • 感谢 Henk,它有效。但我不明白潜在的区别。为什么“copy”和“i”会被区别对待?有什么参考资料可以让我继续学习吗?
    • 在这里查看我的答案以获得解释:stackoverflow.com/questions/55278600/…
    • 您可以在谷歌上搜索“lambda 'captures' the loop variable”以获取数十个 Q+A,主要是在 SO 上。这就是为什么我没有回答太久。
    【解决方案2】:

    我试过这个,它奏效了。希望对您有所帮助。

     @foreach (var item in ListOfUser)
                {
                    <tr>
                        <td>@item.FirstName</td>
                        <td>
                            <button @onclick="(() => GetDetail(item.UserId)) "> Click</button>
                        </td>
                    </tr>
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 2023-01-24
      • 2015-01-05
      • 2017-09-22
      相关资源
      最近更新 更多