简体   繁体   中英

Blazor Wasm - cannot convert from 'method group' to 'EventCallback'

I have a simple Blazor Server app that works ok.

I'm trying to create an equivalent app using Blazor WebAssembly with dotnet 5.

In the working app, I have a razor component that enables the user to upload files using the BlazorFileUploader nuget package

Markup:

<InputFile multiple OnChange="HandleFileSelected"/>

Code behind:

public async Task HandleFileSelected(IFileListEntry[] files)
        {
            if (!ValidateFiles(files, out _errorMsg))
            {
                return;
            }
etc...

When I try to compile the wasm app, I get the following error

CS1503 Argument 2: cannot convert from 'method group' to 'EventCallback'

错误图像

Any ideas what I'm doing wrong?

I dont think the OnChange eventcallback supports a parameter of type IFileListEntry[]

Try to change your code behind to:

public async Task HandleFileSelected(InputFileChangeEventArgs e)
{
    var files = e.GetMultipleFiles();
}

Jonas is correct; your method needs to accept InputFileChangeEventArgs instead of IFileListEntry[] . If you hover over OnChange in Visual Studio 2019, you should see something like this: 在此处输入图像描述

The event handler expects a delegate EventCallback that can accept up to 1 parameter of type InputFileChangeEventArgs . Think of a delegate as a method interface: your declaration of IFileListEntry[] does not match the interface, so you are getting an error.

If you inspect InputFileChangeEventArgs , you can see how to get the files:

public async Task HandleFileSelected(InputFileChangeEventArgs args)
{
    IReadOnlyList<Microsoft.AspNetCore.Components.Forms.IBrowserFile> files =
        args.GetMultipleFiles(args.FileCount);
    // ...

Thanks to Connor and Jonas for the answers. The cause of the problem was that the old Blazor Server app from was built using.Net Core 3.1. This does not contain a "InputFile" component in the Microsoft.AspNetCore.Components.Forms Namespace. This explains why I'd resorted to the 3rd party "BlazorFileUploader" nuget package.

When building the new Blazor WebAssembly app, I'd chosen dotnet 5. The problem was, the markup was now resolving "InputFile" to the Microsoft.AspNetCore.Components.Forms Namespace rather than the BlazorFileUploader namespace.

So, I could fix in one of two ways:

  • Fully qualify the markup to <BlazorFileUploader.InputFile
  • Remove the 3rd party nuget package and refactor the code to make use of the InputFile component now available in the dotnet5 version of the Microsoft namespace

I decided to go with the seconds of the two options.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM