Передача события Blazor onclick в счетчике из цикла

В настоящее время я внедряю пейджинговую обработку таблиц с помощью собственного решения в Blazor и сталкиваюсь с некоторыми трудностями. Неприятный кусок кода приведен ниже (это для рендеринга кнопок подкачки под сеткой):

@for (int i = 0; i < vm.TotalPages; i++)
{
    <button id="pg-button-@i" class="btn btn-primary btn-sm" type="button" onclick="@(() => GetTablePage(i))">@i</button>
}

Обратите внимание на событие onclick, я вызываю функцию и передаю i, счетчик текущего взаимодействия цикла.

GetTablePage Метод выглядит следующим образом:

protected async Task GetTablePage(int page)
{
    Console.WriteLine("page number: " + page);
}

Моя проблема в том, что каждая кнопка будет вызывать эту функцию с i установить как длину vm.TotalPages,

Вот пример, чтобы попытаться прояснить это:

Просмотреть разметку (обратите внимание на id каждой кнопки устанавливается соответственно):

<button id="pg-button-0" class="btn btn-primary btn-sm" type="button">0</button>
<button id="pg-button-1" class="btn btn-primary btn-sm" type="button">1</button>
<button id="pg-button-2" class="btn btn-primary btn-sm" type="button">2</button>
<button id="pg-button-3" class="btn btn-primary btn-sm" type="button">3</button>
<button id="pg-button-4" class="btn btn-primary btn-sm" type="button">4</button>
<button id="pg-button-5" class="btn btn-primary btn-sm" type="button">5</button>
<button id="pg-button-6" class="btn btn-primary btn-sm" type="button">6</button>

После нажатия ЛЮБОЙ из этих кнопок мой GetTablePage функция пишет 7 на консоль, которая является длиной vm.TotalPages коллекция.

Почему это происходит и как я могу это преодолеть?

2 ответа

Решение

Так как i является переменной, и цикл for всегда завершается, когда вы нажимаете, в этот момент он равен 7

Вам нужно сделать что-то вроде:

@for (int i = 0; i < vm.TotalPages; i++)
{
    var tempint = i;
    <button id="pg-button-@i" class="btn btn-primary btn-sm" type="button" onclick="@(() => GetTablePage(tempint))">@i</button>
}

Это стандартное поведение C#, где лямбда-выражение @(() => GetTablePage(i)) имеет доступ к переменной, а не к значению переменной, в результате чего лямбда-выражение всегда вызывает GetTablePage (i) и я равняюсь 7 в конце цикла. Чтобы решить эту проблему, вы можете определить переменную, локально связанную с циклом, как показано ниже:

@for (int i = 0; i < vm.TotalPages; i++)
{
    var temp = i;
    <button id="pg-button-@temp " class="btn btn-primary btn-sm" type="button" onclick="@(() => GetTablePage(temp ))">@temp </button>
}

Надеюсь это поможет...

Другие вопросы по тегам