C# 在blazor中单击按钮时执行异步方法

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

我创建了一个“剃须刀组件”项目。我试图在按下按钮时执行一个异步方法,但还不能理解语法

这是我的索引。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);
    }
}
@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
    不会违反命名准则。