Blazor输入字段同时修改原列表与编辑对象的问题求助
Blazor编辑表单修改影响原列表的问题解决
核心问题出在C#的引用类型特性上:你通过listA.Find获取的对象,和listA里存储的元素是同一个内存引用。当你修改subObjectA的属性时,本质上是在直接修改listA里的原对象,所以表格会同步更新,取消操作自然也无法恢复——因为你从始至终都没操作过"副本",一直改的是原始数据。
解决方法分三步:
点击表格行时创建原对象的深拷贝
不要直接把原对象赋值给subObjectA,而是生成一个完全独立的副本,这样编辑时只会修改副本,不会影响原列表。实现方式有几种:- 手动编写复制构造函数(最直观):
在你的实体类里添加复制构造函数,逐个复制属性:
然后在点击事件里创建副本:public class Bank { public int Id { get; set; } public string BankName { get; set; } // 其他属性 // 复制构造函数 public Bank(Bank source) { Id = source.Id; BankName = source.BankName; // 逐一复制所有需要编辑的属性 } }private void GetBankDetail(int bankId) { var originalBank = listA.Find(b => b.Id == bankId); // 创建独立副本 subObjectA = new Bank(originalBank); // 启用表单编辑状态 IsFormEnabled = true; } - 用序列化反序列化快速生成副本:
借助System.Text.Json实现深拷贝(适合属性较多的类):using System.Text.Json; private void GetBankDetail(int bankId) { var originalBank = listA.Find(b => b.Id == bankId); var json = JsonSerializer.Serialize(originalBank); subObjectA = JsonSerializer.Deserialize<Bank>(json); IsFormEnabled = true; }
- 手动编写复制构造函数(最直观):
取消按钮重置编辑对象
取消时直接清空subObjectA或重置为空白实例,表单绑定的内容就会恢复初始状态:private void CancelEdit() { subObjectA = null; // 或者 new Bank() IsFormEnabled = false; }保存时同步原列表数据
确认修改后,把副本的属性值同步回listA里的原对象:private void SaveEdit() { var targetBank = listA.Find(b => b.Id == subObjectA.Id); if (targetBank != null) { targetBank.BankName = subObjectA.BankName; // 同步其他编辑过的属性 } CancelEdit(); // 复用取消逻辑清空表单 }
内容的提问来源于stack exchange,提问作者Wompguinea
相关产品推荐
相关产品推荐

