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

42
我有一个父组件和一个子组件,其中有一个事件回调函数,我希望它返回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>

我已经添加了一个仓库来解释这个问题。从Blazor的问题中可以看出,这个问题应该在2019年就已经被修复了。https://github.com/scott-david-walker/EventCallbackError

1
@Jean-François Fabre,您能否请取消隐藏此页面上的帖子?这是正确答案之一。 - samayo
12个回答

67
你接近了:
<ChildComponent Item="someModel" T="SomeModel" DeleteCallback="OnDeleteSomeModel" />

@code {
    SomeModel someModel = new SomeModel();

    void OnDeleteSomeModel(SomeModel someModel)
    {
        ...
    }
}
使用了一个泛型类型,如果你没有将类型传递给组件,Blazor就无法推断它。

这意味着,如果你有一个EventCallback<T>,你需要将T的值传递给组件,例如:T="SomeType"


4
我发现问题出在你使用了一个模板化组件,它在处理公共的 EventCallback<T> DeleteCallback 时遇到了困难。你需要声明 T 的类型,而不只是通过使用来推断它。我会更新我的答案。 - Brian Parker
2
做到了,感谢帮助。那个问题真是让人烦恼 :-) - scottdavidwalker
4
希望能得到更具体的错误信息,以便准确地指出问题所在。 - codah
对我来说,问题出在我在自定义组件内使用了一个非泛型的 EventCallBack,而错误是从组件外部抛出的。将其更改为 EventCallBack<需要在组件外部使用的类型> 即可解决问题。 - alelom

19

在我的情况下,我声明了一个可空的EventCallback? - 你不能这样做。


1
它使用了一个EventCallback。问题在于我没有指定类型,使其可为空并不能解决我的问题,也不是我想要解决的方式。请查看Brian的答案以获取解决方案。 - scottdavidwalker
1
不,我的意思是在我的情况下,我之所以收到错误消息,是因为我将其声明为可空属性。 - Sebazzz
啊,抱歉,我误解了 :-) - scottdavidwalker
谢谢@Sebazzz,我也遇到了同样的问题。 - Taylor C. White
这个答案得置顶哈哈。这么简单的事情 - undefined
显示剩余2条评论

8

我曾经发现语法完全正确但仍然出现了这个错误。

重新启动 Visual Studio 2019 对我解决了这个问题。清理和重建不足以解决。


我也有同样的经历。我用一个(正确的)类替换了另一个类,然后出现了这个问题。重建、清理、重新加载项目都不能解决问题,只有重新启动VS2019才行。这是Blazor中许多错误中的一种,可以通过这种方式解决。 - Christoph B
1
VS经常在错误列表中显示与Blazor相关的错误,但实际上并不是真的错误。请检查输出窗口以获取更准确的信息。不过,在这种情况下我也不确定。 - codah

7

由于某些原因,Visual Studio 保留了我先前使用过的签名。清除、重启、清空bin/obj文件夹等都没有起作用。我不得不重命名该方法,这对我起了作用。


1
是的,我可以确认,我也尝试了你提到的所有方法,但只有重命名可行! - Alexander

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 ) {
}

似乎发生了一些变动,文档已经不再是最新的。 该事件也使用自定义事件参数。


4
在我的情况下,问题得到解决是因为我手动定义了@typeparam(而不是通过推理)(TItem="int")。
<MyComponent TItem="int" OnChange="Component_Changed" />

这值得超过一个点赞。设置类型经常被忽视,很少有示例包括它。如果你正在使用“changed”事件而不是直接绑定,几乎总是需要设置类型。 - Brad Bruce

3

对于使用MudBlazor MudTable遇到问题的人,我发现这个方法是行得通的:使用@bind-SelectedItem,并且不要传递任何参数给commit函数。

<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中也遇到过类似的问题。 - PoorbandTony

1

以下解决方案对我有效。

<InputSelect ValueChanged="@((string s) => DoThing(s))" ValueExpression="@(()=> form.MyProperty)"> <option value="0">0</option> <option value="100">100</option> <option value="200">200</option> <option value="300">300</option> </InputSelect>

`@code { MyForm form = new MyForm();

void DoThing(string s)
{
    form.MyProperty = s;
}

public class MyForm
{
    public string MyProperty { get; set; }
}


0
在我的情况下,我得到了以下错误:

Error (active) CS1503 参数 2:无法将“方法组”转换为“EventCallback”

在以下代码中使用了 ValueChanged
<MatAutocompleteList TItem="UseCase" Items="@selectUseCases" ValueChanged=@SelectUseCases>
                        <ItemTemplate>
                            @context?.Label
                        </ItemTemplate>
                    </MatAutocompleteList>

@code
{
    private UseCase SelectUseCases(UseCase useCaseDto)
    {
        if (useCaseDto != null)
        {
            //Do stuff
            
        }
        return null;
    }
}

修改为private void SelectUseCases(UseCase useCaseDto),移除所有的返回值,错误消失了。


0
在我的情况下,有十几个错误中的一个幽灵错误一直存在,无论我做什么都无法消除。这意味着尽管有这么多错误,我仍然可以构建和运行解决方案而没有问题。
对我有帮助的是这个解决方案:https://dev59.com/FL_pa4cB1Zd3GeqP-QA9#66219566

然而,在挖掘了几个小时后,我终于找到了一个解决方案。为了摆脱幽灵错误,我关闭了 Visual Studio,删除了以下文件夹中的文件,然后重新打开了解决方案: C:\Users<Username>\AppData\Local\Temp\VSFeedbackIntelliCodeLogs\Suggestions\

唯一的区别是我删除了所有以 VS 开头的文件夹(C:\Users\<Username>\AppData\Local\Temp\VS*),因为在 @rovert 的帖子中没有这个确切的路径。
这似乎是 Blazor 和 IntelliSense 的一些常见问题。我也经常看到自动格式化程序无法正确格式化 razor 代码(文本缩进混乱)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接