首页 > 解决方案 > 如何在 C# blazer 中的 for 循环内绑定和保存/更新输入复选框

问题描述

任何机构都可以帮助我使用 C# blazor 将带有输入文本框的多个复选框值保存到 db 中吗?当我尝试单击任何复选框时,所有复选框已被选中,因为我只有一个对象,我无法弄清楚如何在循环中分离对象并将其单独保存到数据库中

我的代码是这样的:

@for (int i = 1; i
<=1 3; i++) { <div class="col-md-3 mb-3">
  <div class="form-check">
    <InputCheckbox class="form-check-input" @bind-Value="@testBenchIntilization.PT.PtSelected" /> @i<br />
  </div>
  </div>
  <div class="col-md-8 mb-3">
    <label for="testname" class="control-label">Limit</label>
    <InputNumber for="testname" class="form-control" id="testname" placeholder="Test name" @bind-Value="@testBenchIntilization.PT.PtLimit" />
  </div>
  }

主类:

public class TestBenchIntilization
{
    [Required]
    public int TestId { get; set; }

    public TestBenchPressureTransducer PT{ get; set; } = new TestBenchPressureTransducer();
}

子类:

public class TestBenchPressureTransducer
{
    public int  TestId { get; set; }
    public DateTime TestDate { get; set; }
    public string PtName { get; set; }
    public bool PtSelected{ get; set; }
        public float PtLimit { get; set; }
}

标签: c#asp.net-coreblazor

解决方案


您需要复制循环索引。例如,我必须复制到 iCopy。

如果你不复制它,那么值将是 3 = for 完成时的值。循环位于 lambda 表达式中。

要了解为什么https://github.com/dotnet/AspNetCore.Docs/issues/10768

这是基于您的示例的简化版本。

    @page "/"

    <EditForm Model="@data" OnValidSubmit="@submit">
    @for (int i = 0; i < 3; i++)
    {
        int iCopy = i;
        <div class="col-md-3 mb-3">
            <div class="form-check">
                <InputCheckbox class="form-check-input" @bind-Value="@data[iCopy].selected" /> @(iCopy+1)<br />
            </div>
        </div>
        <div class="col-md-8 mb-3">
            <label for="testname" class="control-label">Limit</label>
            <InputNumber for="testname" class="form-control" id="testname" placeholder="Test name" @bind-Value="@data[iCopy].limit" />
        </div>
    }
    <button type="submit">Submit</button>
</EditForm>

@(result)

@code{
    public class Test
    {
        public bool selected;
        public int limit;
    };

    string result = "";
    Test[] data = new Test[3];

    protected override void OnInitialized()
    {
        for (int i = 0; i < 3; i++)
            data[i] = new Test();
    }

    void submit()
    {
        result = "";
        for (int i = 0; i < 3; i++)
            result += $"[{data[i].selected},{data[i].limit}],";
    }
}

推荐阅读