Привязка не может работать: когда изменяется значение входного текста, вы хотите изменить список, а не сам элемент.
Вместо этого вам нужно «разделить» то, что делает привязка в двух. направления:
- установить значение поля ввода на основе значения модели
- установить модель при изменении значения поля ввода
Приведенный ниже код показывает, как решить основную проблему, затем вам необходимо адаптировать ее к вашим потребностям.
@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
, которое должно знать, где в исходном списке должно быть обновлено значение.
Если вы предпочитаете, вы можете использовать для l oop:
@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" };
}