gpt4 book ai didi

c# - 如何绑定(bind)到 Blazor 中集合/列表中的元素?

转载 作者:行者123 更新时间:2023-12-03 16:07:42 30 4
gpt4 key购买 nike

我想在循环中将值绑定(bind)到列表中的元素,但我找不到好的解决方案。

<EditForm Model="@dailyReport" OnValidSubmit="@SubmitDailyReport">
<p>
<label>Count: </label>
<InputNumber min="1" id="numberOfEffects" @bind-Value="numberOfEffects" />
</p>
@{
for (int i = 1; i <= numberOfEffects; i++)
{
if (effects.Count < i)
{
effects.Add("");
}

if (effects.Count > i)
{
effects.RemoveAt(effects.Count - 1);
}

string concatId = "effect" + i.ToString();

<p>
<label for="@concatId">@i</label>
<InputText id="@concatId" @bind-Value="effects.ElementAt(i-1)" />
</p>
}
}
//rest code
</EditForm>
当我尝试将值绑定(bind)到列表中的元素时,出现错误:
  • 错误 CS0131:分配的左侧必须是
    变量、属性或索引器错误
  • 错误 CS1662:无法转换 lambda
    表达式到预期的委托(delegate)类型,因为一些返回
    block 中的类型不能隐式转换为委托(delegate)
    返回类型

  • 我想知道是否有任何可能的方法将数据绑定(bind)到集合。我需要它,因为我的模型具有 List 类型的属性。在我的输入表单中,我希望允许添加用户需要的尽可能多的字符串。
    编辑:
    @code
    {
    private DailyReport dailyReport = new DailyReport();
    private List<string> effects = new List<string>();
    }
    我也尝试在 foreach 循环中执行此操作,但显示了另一个错误:
    无法分配给“效果”,因为它是“foreach 迭代变量”
    foreach (var effect in effects)
    {
    index++;
    Console.WriteLine(index);

    string concatId = "effect" + index.ToString();

    <p>
    <label for="@concatId">@index</label>
    <InputText id="@concatId" @bind-Value="effect" />
    </p>
    }

    最佳答案

    绑定(bind)不起作用:当输入文本的值更改时,您想要修改列表,而不是元素本身。

    相反,您必须“拆分”绑定(bind)在两个方向上的作用:

  • 根据模型的值设置输入字段的值
  • 当输入字段的值发生变化时设置模型

  • 下面的代码显示了如何解决主要问题,然后您必须根据需要对其进行调整。

    @foreach (var element in effects.Select((e, i) => new { Effect = e, Index = i}))
    {
    <p>
    <label for="@($"effect{element.Index}")">@element.Index</label>
    <input id="@($"effect{element.Index}")" value="@element.Effect"
    @onchange="@(e => effects[element.Index] = e.Value.ToString())" />
    </p>
    }

    @code {

    private List<string> effects = new List<string>() { "a", "b", "c" };

    }

    第一行起到了作用:它将列表转换为可枚举,其中每个元素都是一个新对象,它封装了 effects 中的两个索引。列表和值。您需要索引主要是因为 @onchange事件,它必须知道应该在原始列表中的哪个位置更新值。

    如果您愿意,可以使用 for 循环:

    @for (int i = 0; i < effects.Count; i++)
    {
    // see https://stackoverflow.com/a/56426146/323447
    var iCopy = i;

    <p>
    <label for="@($"effect{i}")">@i</label>
    <input id="@($"effect{i}")" value="@effects[i]"
    @onchange="@(e => effects[iCopy] = e.Value.ToString())" />
    </p>
    }

    @code {

    private List<string> effects = new List<string>() { "a", "b", "c" };

    }

    关于c# - 如何绑定(bind)到 Blazor 中集合/列表中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60416018/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com