Blazor - 无法从“方法组”转换为“EventCallback”

sco*_*ker 15 components blazor blazor-server-side

我遇到了一个基本的 blazor 项目的问题。我有一个父组件和一个带有事件回调的子组件,我希望它传回一种类型的 T。我遇到的问题是我在将 MethodGroup 转换为 EventCallback 时出错。如果我将其转换为使用 Action 则它可以工作,但我不能异步执行,这并不理想。任何想法我做错了什么?

家长

<Child
DeleteCallback="@OnDelete"></Child>

public async Task OnDelete(T item)
{
}
Run Code Online (Sandbox Code Playgroud)

孩子

@typeparam T

[Parameter]
public EventCallback<T> DeleteCallback { get; set; }

 <a @onclick="() => DeleteCallback.InvokeAsync(item)"></a>
Run Code Online (Sandbox Code Playgroud)

我在这里添加了一个 repo 来解释这个问题。查看 Blazor 的问题,这应该已在 2019 年修复。https://github.com/scott-david-walker/EventCallbackError

Gui*_*rez 22

我遇到了同样的问题,我的代码没有任何问题,只是关闭了 VS 并重新打开和 vuala!我很惊讶这确实发生在我身上好几次...... MS 非常糟糕!

  • 儿子……这对我也有用。天哪,这会让开发变得有点痛苦。 (2认同)

Seb*_*zzz 20

就我而言,我声明了一个可为空的EventCallback?- 你不能这样做。


Bri*_*ker 18

你很接近:

<ChildComponent Item="someModel" T="SomeModel" DeleteCallback="OnDeleteSomeModel" />

@code {
    SomeModel someModel = new SomeModel();

    void OnDeleteSomeModel(SomeModel someModel)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

EventCallback 使用泛型类型,如果不将类型传递给组件,blazor 将无法推断它。

这意味着,如果您有 a EventCallback<T>,则需要将 的值传递T给组件,例如T="SomeType"

  • 我发现这个问题是因为您使用模板化组件时,它在公共 EventCallback&lt;T&gt; DeleteCallback 方面遇到了麻烦,您需要声明 T 的类型,而不仅仅是通过使用来推断它。我会更新我的答案 (4认同)
  • 如果能得到更具体的错误消息来实际指出问题所在,那就太好了。 (4认同)

小智 8

我经历过语法正确但仍然出现此错误。

重新启动 Visual Studio 2019 解决了我的问题。清理和重建还不够。


Kri*_*lén 7

由于某种原因,Visual Studio 保留了我以前使用过的签名。清理、重新启动、清空 bin/obj 文件夹等都不起作用。我必须重命名该方法,这对我有用。


csk*_*kwg 6

以下语法对我有用:

// in the component (C#):
[Parameter]
public EventCallback<MovingEventArgs> OnMoving { get; set; }

// on the using side (Razor):
OnMoving="(Component.MovingEventArgs o) => OnMoving(o)"

// on the using side (C#):
protected void OnMoving( Component.MovingEventArgs e ) {
}
Run Code Online (Sandbox Code Playgroud)

似乎发生了变化,并且文档不是最新的。此事件还使用自定义事件参数。


nAv*_*viD 5

@typeparam就我而言,当我手动定义(不是通过推理)( )时,问题就解决了TItem="int"

<MyComponent TItem="int" OnChange="Component_Changed" />
Run Code Online (Sandbox Code Playgroud)