Blazor foreach循环绑定Checkbox报错:无法赋值给迭代变量item
解决方法
出现这个错误是因为foreach的迭代变量是只读的,双向绑定(@bind-Checked)会尝试修改变量的属性,编译器不允许直接操作迭代变量。以下两种方案可以解决:
方案一:使用for循环替代foreach
通过索引访问列表中的元素,直接绑定元素的属性:
@for (int i = 0; i < myPerson.Persons?.Count; i++) { <MudCheckBox @bind-Checked="myPerson.Persons[i].IsAlive" /> } @code{ var myPerson = new MyPerson { Persons = new List<Person>() }; public class MyPerson { public List<Person> Persons { get; set; } } public class Person { public bool IsAlive { get; set; } } }
这里通过索引myPerson.Persons[i]直接访问列表中的实际对象,绕过了只读的迭代变量限制。添加?.是为了避免列表为空时的空引用异常。
方案二:将迭代变量赋值给局部变量
在foreach内部把迭代变量赋值给一个可修改的局部变量,再绑定局部变量的属性:
@foreach (var item in myPerson.Persons ?? Enumerable.Empty<Person>()) { var person = item; <MudCheckBox @bind-Checked="person.IsAlive" /> } @code{ var myPerson = new MyPerson { Persons = new List<Person>() }; public class MyPerson { public List<Person> Persons { get; set; } } public class Person { public bool IsAlive { get; set; } } }
局部变量person是原对象的引用,修改person.IsAlive会同步更新原列表中的对应对象。?? Enumerable.Empty<Person>()确保列表为空时不会报错。
内容的提问来源于stack exchange,提问作者TheBoubou
相关产品推荐
相关产品推荐

