传递给 onclick 函数的 blazor 变量参数 [重复]

Posted

技术标签:

【中文标题】传递给 onclick 函数的 blazor 变量参数 [重复]【英文标题】:blazor variable argument passing to onclick function [duplicate] 【发布时间】: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>
        

【问题讨论】:

【参考方案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”会被区别对待?有什么参考资料可以让我继续学习吗? 在这里查看我的答案以获得解释:***.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>
            

【讨论】:

以上是关于传递给 onclick 函数的 blazor 变量参数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将变量传递给动态创建的 javascript onclick 函数? [关闭]

如何在 Blazor Web Assembly 中将 c# 变量传递给 javascript

Blazor 如何将参数传递给 onclick 函数?

onclick 怎样传递参数

将 Razor 语法变量传递给 Html Helper 的 javascript onclick

django:如何将模板变量传递给 javascript onclick 例程?