I'm currently implementing table paging via a home grown solution in Blazor and coming across some difficulty. The troublesome piece of code is below (this is for rendering the paging buttons below a grid):
@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>
}
Notice in the onclick event, I am calling a function and passing in i
, the counter for the current interation of the loop.
The GetTablePage
method looks as follows:
protected async Task GetTablePage(int page)
{
Console.WriteLine("page number: " + page);
}
My issue is that EVERY button will call this function with i
set as the length of vm.TotalPages
.
Here is an example to try to make this more clear:
View Markup (notice the id
of each button is set appropriately):
<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>
Upon clicking ANY of these buttons, my GetTablePage
function is writing 7
to the console which is the length of the vm.TotalPages
collection.
Why is this happening and how can I overcome it?
You can use a lambda expression to pass multiple arguments to an onclick event.
Blazor does not have support to manipulate DOM elements directly, but we can still achieve it by using JavaScript interop. By creating a reference to an element, we can send it as a parameter to the JavaScript method via interop.
Because i
is a variable and the for loop is always finished when you click, it is 7 on that moment
You need to do something like:
@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>
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With