Blazor应用修改单个替代项参数ActualValue引发所有替代项同步变更问题
问题原因
正如你观察到的,修改某一替代项的参数值时所有替代项同步变更,根源在于引用类型的共享赋值:
你在代码中使用alt.AltParameters ??= dataModel.EndNodeParameters;,而List<ParameterModel>是引用类型。这意味着所有Alternative实例的AltParameters都会指向同一个内存中的集合对象。当你修改某个Alternative下参数的ActualValue时,本质是修改这个共享集合里的ParameterModel对象属性,因此所有关联的Alternative都会同步显示变化,和参数ID无关。
修复方案
需要为每个Alternative创建独立的参数集合及参数实例,避免引用共享:
1. 修改Razor代码中的赋值逻辑
将原代码中的引用赋值改为创建新的集合和参数实例:
@foreach (var alt in dataModel.Alternatives) { // 为每个Alternative创建独立的参数集合,拷贝原参数的属性值 alt.AltParameters ??= dataModel.EndNodeParameters .Select(p => new ParameterModel { Id = p.Id, ActualValue = p.ActualValue, Usefulness = p.Usefulness // 补充ParameterModel的其他必要属性 }).ToList(); var altParam = alt.AltParameters.FirstOrDefault(p => p.Id == param.Id); <td> <div style="display: flex; margin-bottom: 5px"> <div class="input-group" style="margin-left: 10px;"> <input type="number" min="1" max="10" class="form-control" @bind="@altParam.ActualValue"> <span class="input-group-text weight-unit" style="border-color: dodgerblue; background-color: dodgerblue;">V</span> </div> <div class="input-group" style="margin-left: 10px;"> <input type="number" min="1" max="10" class="form-control" readonly @bind-value="@altParam.Usefulness"> <span class="input-group-text weight-unit" style="border-color: limegreen; background-color: limegreen;">U</span> </div> </div> </td> }
2. 优化方案(推荐)
如果ParameterModel需要频繁拷贝,建议为其实现拷贝方法,让代码更简洁:
public class ParameterModel { // 原有属性 public string Id { get; set; } public int ActualValue { get; set; } public int Usefulness { get; set; } // 实现拷贝方法 public ParameterModel Clone() { return new ParameterModel { Id = this.Id, ActualValue = this.ActualValue, Usefulness = this.Usefulness // 其他属性 }; } }
然后在Razor中使用:
alt.AltParameters ??= dataModel.EndNodeParameters.Select(p => p.Clone()).ToList();
关键说明
通过创建新的ParameterModel实例,每个Alternative的AltParameters集合都是独立的内存对象,修改其中一个的参数值不会影响其他Alternative的参数数据。
内容的提问来源于stack exchange,提问作者Tim Povodnik
相关产品推荐
相关产品推荐

