Blazor 传递和来自子组件的 运行 任务 - 无法从 'method group' 转换为 'Task<int>'

Blazor pass and run Task from child component - cannot convert from 'method group' to 'Task<int>'

在我的父组件中,我有一个任务,我想将其传递给子组件。

父组件:

    <ChildComponent ChangePageMethod="@ChangePage" />
    @code {
           public async Task ChangePage(int page)
           {
              Console.WriteLine(page);
           }
     }

子组件:

<a @onclick="prevPage">Prev</a>
<a @onclick="nextPage">Next</a>
@code {
    [Parameter]
    public int Page { get; set; } = 3;

    [Parameter]
    public Task ChangePageMethod { get; set; }

    private void prevPage()
    {
        
    }
    private void _nextPage()
    {
        
    }
}

目前我收到此错误:无法从 'method group' 转换为 'Task'

有什么解决方法吗?以及如何 运行 从父级传递参数的任务?

该错误为您提供了您正在尝试执行的操作的准确解释。您正在尝试将方法设置为 Task 属性。 Task不是你的方法,Task是你的方法returns。所以如果你想存储这个方法,使用像 Func<int, Task>.

这样的类型

对于运行存储在这个属性中的方法,你应该在你要调用它的方法中添加async修饰符,例如private async void prevPage(), 并在其正文中使用 await ChangePageMethod(Page);.

此外,我建议您闲暇时阅读有关 async/await 和任务的文章。

这种情况的经典模式是 ChildComponent

中的以下代码
<a @onclick="(e) => prevPage()">Prev</a>
<a @onclick="(e) => nextPage()">Next</a>

使用 Lambda 表达式将鼠标事件接收为 e,然后调用您的方法。

[Parameter]
    public EventCallback<int> ChangePageMethod { get; set; }

private void nextPage()
{
   // increment the page and call the Event CallBack
   Page++;
   ChangePageMethod.InvokeAsync(Page);
}

nextPage 递增页面计数器,然后调用回调事件。您不需要在此处使用任务。触发此事件的鼠标单击事件是即发即弃。

ParentComponent 中,回调 ChangePageMethod 现在传递页码,因此 ChangePage 将正确处理它。

public void ChangePage(int page)
{
    Console.WriteLine(page);
}

ChangePage是事件处理器所以一般情况下你return一个void。如果它包含任何异步代码,您会将其标记为异步。请参阅下面我们使用异步 Task.Delay() 模拟屈服 Task.

的地方
public async void ChangePage(int page)
{
    await Task.Delay(10);
    Console.WriteLine(page);
}

ChangePage 只需要声明为 return a Task 如果您在 nextPageprevPage 中有低于 InvokeAsync 的代码在执行之前需要等待你在 ChangePage 中所做的任何事情。

下面 ChangePage 的两个示例模式:

public async Task ChangePage(int page)
{
    Console.WriteLine(page);
    return Task.Delay(10);
}

public Task ChangePage(int page)
{
    Console.WriteLine(page);
    return Task.Completed;
}

上一页的示例模式

private async void prevPage()
{
   // decrement the page and call the Event CallBack
   Page--;
   await ChangePageMethod.InvokeAsync(Page);
   // Dependant code here
}

PS - 我认为我的所有代码都是正确的,但我还没有测试代码,所以可能会有一两个错字。检查 MS 文档 here 中的数据绑定。