Blazor 如何将一个绑定到布尔数组

3

我有一个对象数组,其中包含一个 IsChecked 属性。 我使用该数组填充表格,在 IsChecked 属性上使用 @bind 绑定到输入框。

当我尝试切换值时,会出现错误。 如果我立即更改值为 IsChecked = true,则复选框将被选中。

for(var i = 0; i < firms.Length; i++)
{
    <tr>
        <td>@firms[i].ShortTitle</td>
        <th scope="row">
            <div class="custom-control custom-checkbox">
                <input type="checkbox" ... @bind="@firms[i].IsChecked" />
             ..
            </div>
        </th>
    </tr>
}

错误:

Microsoft.AspNetCore.Components.Server.Circuits.RemoteRenderer: 警告:未处理的异常呈现组件:索引超出数组界限。

System.IndexOutOfRangeException:索引超出了数组范围。 在....<>c__DisplayClass0_1.b__6(Boolean __value) 在 Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.<>c__DisplayClass22_0`1.b__0(ChangeEventArgs e) --- 在抛出异常的前一个位置结束调用堆栈跟踪 --- 在 Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task) 在 Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle) Microsoft.AspNetCore.Components.Server.Circuits.CircuitHost: 错误: 'LzL8iNZr7FmkJFJRS3QTW3QzJwP9R-p3CaclRHcE1_A.'电路中出现未处理的异常。

System.IndexOutOfRangeException:索引超出了数组范围。 在...<>c__DisplayClass0_1.b__6(Boolean __value) 在 Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.<>c__DisplayClass22_0`1.b__0(ChangeEventArgs e) --- 在抛出异常的前一个位置结束调用堆栈跟踪 --- 在 Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task) 在 Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle)

我做错了什么?


1
我认为循环变量被闭包捕获了,所以一旦它尝试实际绑定时,i == firms.Length。如果在每次迭代中只打印i到页面上会发生什么?它的值是firms.Length的值重复firms.Length次吗? - Jonathon Chase
1个回答

9
在你的代码中(你没有显示所有的代码),执行了“代表”EventCallback,但出现了“索引超出数组界限”的错误。这是因为访问索引值的代码始终获取最后一个索引 + 1。
要解决这个问题,可以使用本地变量来赋值i的值,类似于以下内容:
var local = i;

点击此处查看我的答案...

希望这可以帮到你...


它确实有帮助,但我已经将for循环更改为foreach。 - pasha goroshko
是的,这个问题已经被修复了,但只针对foreach()循环而不是for()循环。其原因在于生成的代码包含一个lambda表达式,请搜索“lambda闭包”。 - H H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接