C# 在blazor中单击按钮时执行异步方法
我创建了一个“剃须刀组件”项目。我试图在按下按钮时执行一个异步方法,但还不能理解语法 这是我的索引。razor:C# 在blazor中单击按钮时执行异步方法,c#,razor,blazor,blazor-server-side,razor-components,C#,Razor,Blazor,Blazor Server Side,Razor Components,我创建了一个“剃须刀组件”项目。我试图在按下按钮时执行一个异步方法,但还不能理解语法 这是我的索引。razor: @page "/" @inject GenericRepository<Person> PersonRepository // ... @foreach (var person in persons) { <button onclick="@(() => Delete(person.Id))">❌</button> } @fu
@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);
}
}
@page/“
@注入GenericRepository PersonRepository
// ...
@foreach(var个人对个人)
{
❌
}
@功能{
// ...
异步无效删除(Guid personId)
{
等待这个.PersonRepository.Delete(personId);
}
}
当我点击按钮时,什么也没发生。我尝试了各种返回类型(例如,任务
)等等,但不知道如何让它工作。如果我需要提供更多信息,请告诉我
每个文档/教程仅适用于单击按钮时的非异步void调用
提前感谢。您需要正确调用
Delete
方法,使其返回任务,而不是void
:
<button onclick="@(async () => await Delete(person.Id))">❌</button>
@functions {
// ...
async Task Delete(Guid personId)
{
await this.PersonRepository.Delete(personId);
}
}
❌
@功能{
// ...
异步任务删除(Guid personId)
{
等待这个.PersonRepository.Delete(personId);
}
}
@WoIIe,
1.使用lambda表达式作为onclick属性的值的目的是,您可以将值传递给Delete方法。如果已经在代码中定义了person对象,则不必使用lambda表达式。只需执行以下操作:onclick=“@Delete”
,然后从Delete方法访问person.Id
你有没有再按一下按钮?我相信这个代码:等待这个.PersonRepository.Delete(personId)
确实执行了,但是您在GUI上没有看到响应,因为不推荐使用void,它要求您调用StateHasChanged();手动重新渲染。请注意,在方法“结束”时,StateHasChanged()已经被自动调用过一次,但由于您返回的是void而不是Task,因此应该再次调用StateHasChanged()以查看更改。但不要这样做。参见DavidG的答案“如何正确编码”李>
这也是您编写代码的方式:
<button onclick="@Delete">Delete Me</button>
@functions {
Person person = new Person();
//....
async Task Delete()
{
await this.PersonRepository.Delete(person.Id);
}
}
删除我
@功能{
Person=新人();
//....
异步任务删除()
{
等待这个.PersonRepository.Delete(person.Id);
}
}
更多的代码根据要求
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);
}
}
foreach(人与人之间的变量)
{
删除
}
@功能{
//获取一份人员列表。
列出人员名单;
受保护的重写异步任务OnParametersSetAsync()
{
People=waiting this.PersonRepository.getAll();
}
异步任务删除(Guid personId)
{
等待这个.PersonRepository.Delete(personId);
}
}
注意:如果您仍然没有解决问题,请显示所有代码谢谢,但按钮位于foreach(perons中的var person)
循环中。你能提供一些你将如何认识到这一点的代码吗?谢谢你在第二点中的澄清。稍后我会尝试:)我想知道为什么每个人都会创建不必要的异步状态机(在匿名方法上)。为什么不干脆onclick=“@(e=>Delete(person.Id))”
?顺便说一句:deleteAncy
不会违反命名准则。