Blazor中如何基于List<string>动态创建FluentTextField?
问题根源
你遇到的报错本质是:foreach循环中的迭代变量是集合元素的只读副本,且string是值类型,无法通过这个副本修改原List中的元素;同时双向绑定需要可读写的目标对象,这就导致绑定失效。
核心解决思路
思路1:通过索引直接绑定集合元素
放弃foreach,改用for循环遍历List的索引,直接将文本框绑定到_stringValues[index]。这种方式直接操作List的对应位置元素,避开了迭代变量的只读限制,双向绑定的修改会直接同步到原List;且当List长度变化(点击Add添加元素)时,Blazor会自动触发组件重新渲染,生成新的文本框。
思路2:将值类型包装为引用类型
把string包装成一个包含可读写属性的引用类型类(比如定义一个简单的TextItem类,包含public string Value { get; set; }属性),用List<TextItem>替代List<string>。此时foreach循环中的每个元素是引用类型实例,绑定到item.Value时,修改的是实例的属性(而非只读副本),修改会直接反映到原集合中的对象,同时支持双向绑定。
思路3:拆分独立子组件管理单个输入
创建一个独立的子组件负责单个文本输入逻辑,子组件暴露双向绑定参数(比如[Parameter] public string InputValue { get; set; }和[Parameter] public EventCallback<string> InputValueChanged { get; set; })。父组件遍历集合时,为每个元素渲染子组件并绑定对应的值,子组件内部处理输入交互,父组件只需维护集合的增删和数据同步。这种方式解耦了逻辑,更符合Blazor组件化开发的设计思想。
内容的提问来源于stack exchange,提问作者Hellfire

