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

Posted

技术标签:

【中文标题】Blazor - 无法从“方法组”转换为“EventCallback”【英文标题】:Blazor - cannot convert from 'method group' to 'EventCallback' 【发布时间】:2021-01-26 05:47:18 【问题描述】:

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

父母

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

public async Task OnDelete(T item)


孩子

@typeparam T

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

 <a @onclick="() => DeleteCallback.InvokeAsync(item)"></a>

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

【问题讨论】:

【参考方案1】:

就我而言,这是数十个其他人中的幻觉错误,无论我做什么都不会消失。这意味着尽管有很多错误,我仍然可以毫无问题地构建和运行解决方案。

帮助我的是这个解决方案:https://***.com/a/66219566/1215913

但是,经过几个小时的挖掘,我终于找到了解决方案。到 摆脱幻象错误我关闭了 Visual Studio,删除了 以下文件夹中的文件,然后重新打开解决方案: C:\Users\AppData\Local\Temp\VSFeedbackIntelliCodeLogs\Suggestions\

唯一的区别是我删除了所有以 VS (C:\Users\&lt;Username&gt;\AppData\Local\Temp\VS*) 开头的文件夹,因为没有 @rovert 在他的帖子中提到的确切路径。

这似乎是BlazorIntelliSense 的一些常见问题。我还经常看到自动格式化程序无法正确格式化razor 代码(文本缩进很乱)。

【讨论】:

【参考方案2】:

好的,我只是花了几个小时试图弄清楚这一点。原来我的问题是我在项目中有同步融合,我已经明确定义了事件回调参数的名称空间,在我的例子中是子组件中的 Microsoft.AspNetCore.Components.ChangeEventArgs 然后创建一个异步方法将数据传回给父级。

【讨论】:

【参考方案3】:

对于使用 MudBlazor MudTable 解决此问题的任何人,我发现使用 @bind-SelectedItem 并且不将任何参数传递给提交函数。

<MudTable T="POCO" Items="@MyState.POCOs" 
                              @bind-SelectedItem="_selectedPOCO"  
                              OnCommitEditClick="@(() => commitPOCO())"
                              CommitEditTooltip="Save Changes?">
@code 
    private POCO _selectedPOCO;

    private async void commitPOCO()
    
        // all the changed values are in _selectedPOCO
        ...
    

【讨论】:

谢谢,文档中根本没有说明,MudSelect 也有类似的问题。【参考方案4】:

在我的例子中,当我手动定义@typeparam(不是通过推理)(TItem="int")时,问题就解决了。

<MyComponent TItem="int" OnChange="Component_Changed" />

【讨论】:

【参考方案5】:

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

【讨论】:

可以确认,也尝试了你提到的所有方法,但只有重命名有效!【参考方案6】:

我发现语法正确,但仍然出现此错误。

重新启动 Visual Studio 2019 为我解决了这个问题。清洁和重建是不够的。

【讨论】:

这里有同样的经历。我用另一个(正确的)班级替换了一个班级,并遇到了这个问题。重建、清理、重新加载项目并不能解决问题,只能重新启动 VS2019。这是 Blazor 中可以通过这种方式解决的众多错误之一 VS 经常在错误列表中显示 Blazor 相关错误,但实际上并不正确。检查输出窗口以获得更准确的信息。不过在这种情况下不确定。【参考方案7】:

在我的例子中,我声明了一个可以为空的 EventCallback? - 你不能那样做。

【讨论】:

它正在使用 EventCallback。问题是我没有指定类型,使它可以为空不会解决我的问题,也不会是我想要解决它的一种方式。检查布赖恩的解决方案的答案 不,我是说在我的情况下我收到了错误消息因为我将其声明为可为空的属性。 啊抱歉,我误会了:-) 谢谢@Sebazzz,我遇到了同样的问题。【参考方案8】:

你很亲密:

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

@code 
    SomeModel someModel = new SomeModel();

    void OnDeleteSomeModel(SomeModel someModel)
    
        ...
    

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

这意味着,如果您有 EventCallback&lt;T&gt;,则需要将 T 的值传递给组件,例如T="SomeType".

【讨论】:

我发现这个问题是因为您使用模板化组件时遇到公共 EventCallback DeleteCallback 问题,您需要声明 T 的类型,而不仅仅是通过使用来推断它。我会更新我的答案 成功了,为帮助喝彩。那是一个烦人的:-) 如果能获得更具体的错误消息,实际上将我们指向问题所在,那就太好了。【参考方案9】:

以下语法对我有用:

// 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 ) 

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

【讨论】:

以上是关于Blazor - 无法从“方法组”转换为“EventCallback”的主要内容,如果未能解决你的问题,请参考以下文章

Int 到字符串:无法从“方法组”转换为“字符串”[关闭]

无法将“System.String”类型的对象转换为“System.Int32”类型。关于 Blazor/Razor 路由参数

.Net 6 - 用于 blazor 的 UseCors

无法将方法组“FirstOrDefault”转换为非委托类型

免费开源Blazor在线Ico转换工具

Blazor 中的“无法从绑定属性‘绑定值’推断属性名称”错误