Rob Bowman
Rob Bowman

Reputation: 8731

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'

error image

Any ideas what I'm doing wrong?

Upvotes: 4

Views: 6131

Answers (3)

Rob Bowman
Rob Bowman

Reputation: 8731

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.

Upvotes: 0

Connor Low
Connor Low

Reputation: 7216

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: enter image description here

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

Upvotes: 3

Jonas
Jonas

Reputation: 123

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();
}

Upvotes: 2

Related Questions