使用 Blazor 创建动态 url 在循环时给出错误的引用

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

我正在创建 Blazor WebAssembly 应用程序,并在循环内容以生成 mp3 文件的 url 时遇到问题。

媒体文件名为“1.mp3”、“2.mp3”、“3.mp3”...等

假设您有一个包含以下内容的剃刀页面:

@* set counter variable to 1 *@
@InitCounter()

@foreach(string str in strings)
{
   <div>
       <span @onclick="() => PlayUrl(counter)">@counter</span>
       <span>@str</span>
   </div>

   @* Increment counter variable by 1 *@
   @IncrementCounter()
}

@code
{
    public int counter = 1;

    public string InitCounter()
    {
       counter = 1;
       return string.Empty;
    }

    public string IncrementCounter()
    {
       counter++;
       return string.Empty;
    }
}

当我在浏览器中单击特定的 span 元素时,我无法理解为什么函数

PlayUrl
被调用时使用了错误的值?

我们可以说

strings
是这样定义的:


   strings[] strings = { "aaa", "bbb" };

这应该会生成一些与此类似的 html:

<div>
  <span b-2e01zi41cp="">1</span>
  <span b-2e01zi41cp="">aaa</span>
</div>
<div>
  <span b-2e01zi41cp="">2</span>
  <span b-2e01zi41cp="">bbb</span>
</div>

无论我单击哪个 span 元素,它都会始终使用参数“3”调用 PlayUrl。

有没有人可以解释为什么以及如何让 Blazor 将正确的值传递给 PlayUrl?

c# html razor foreach blazor
1个回答
0
投票

您已将

foreach()
变成了
for()
循环,anf for 循环和 lambda 是危险的组合。

@foreach(string str in strings)
{
   int counterCopy = counter;
   <div>
       <span @onclick="() => PlayUrl(counterCopy)">@counter</span>
       <span>@str</span>
   </div>

   @* Increment counter variable by 1 *@
   @IncrementCounter()
}

如需解释,请查找无数重复项之一,搜索术语“关闭循环变量”

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