I created a "Razor Components" project. I am trying to execute an asynchronous method when pressing a button, but could not figure out the syntax yet.
This is my Index.razor:
@page "/"
@inject GenericRepository<Person> PersonRepository
@foreach (var person in persons)
{
<button onclick="@(() => Delete(person.Id))">❌</button>
}
@functions
{
async void Delete(Guid personId)
{
await this.PersonRepository.Delete(personId);
}
}
When I click the button, nothing happens. I tried various return types (e.g. Task
) and stuff, but cannot figure out how to make it work. Please let me know if I need to provide more information.
Every documentation / tutorial only just works with non-async void calls on button click.
You need to call the Delete
method properly and make it return Task
instead of void
:
<button onclick="@(async () => await Delete(person.Id))">❌</button>
@functions {
// ...
async Task Delete(Guid personId)
{
await this.PersonRepository.Delete(personId);
}
}
@WoIIe,
1. The purpose of using a lambda expression as a value for the onclick attribute is so that you can pass a value to the Delete method. If you have already defined a person object in your code, you don't have to use a lambda expression. Just do this: onclick = "@Delete"
, and access person.Id from the Delete method.
await this.PersonRepository.Delete(personId);
did execute, but you've seen no response on the GUI because the use of void, which is not recommended, requires you to call StateHasChanged(); manually to re-render. Note that StateHasChanged() has already been automatically called once when your method "ended", but since you're returning void and not Task, you should call StateHasChanged() once again to see the changes. But don't do it. See the answer by DavidG how to code properly. This is also how you can code:
<button onclick="@Delete">Delete Me</button>
@functions {
Person person = new Person();
//....
async Task Delete()
{
await this.PersonRepository.Delete(person.Id);
}
}
More code as per request...
foreach(var person in people)
{
<button onclick="@(async () => await Delete(person.Id))">Delete</button>
}
@functions {
// Get a list of People.
List<Person> People ;
protected override async Task OnParametersSetAsync()
{
People = await this.PersonRepository.getAll();
}
async Task Delete(Guid personId)
{
await this.PersonRepository.Delete(personId);
}
}
Note: If you still have not solved your problems, show all your code
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