You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:50:38