传递给 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