Blazor Wasm - 无法从 'method group' 转换为 'EventCallback'
Blazor Wasm - cannot convert from 'method group' to 'EventCallback'
我有一个运行正常的简单 Blazor 服务器应用程序。
我正在尝试使用 Blazor WebAssembly 和 dotnet 5 创建一个等效的应用程序。
在工作应用程序中,我有一个 razor 组件,允许用户使用 BlazorFileUploader nuget 包上传文件
标记:
<InputFile multiple OnChange="HandleFileSelected"/>
后面的代码:
public async Task HandleFileSelected(IFileListEntry[] files)
{
if (!ValidateFiles(files, out _errorMsg))
{
return;
}
etc...
当我尝试编译 wasm 应用程序时,出现以下错误
CS1503 参数 2:无法从 'method group' 转换为 'EventCallback'
知道我做错了什么吗?
我认为 OnChange
事件回调不支持 IFileListEntry[]
类型的参数
尝试将您的代码更改为:
public async Task HandleFileSelected(InputFileChangeEventArgs e)
{
var files = e.GetMultipleFiles();
}
乔纳斯是正确的;您的方法需要接受 InputFileChangeEventArgs
而不是 IFileListEntry[]
。如果您将鼠标悬停在 Visual Studio 2019 年的 OnChange
上,您应该会看到如下内容:
事件处理程序需要一个 delegate EventCallback
,最多可以接受 1
个 InputFileChangeEventArgs
类型的参数。将 delegate
视为方法接口:您的 IFileListEntry[]
声明与接口不匹配,因此您收到错误。
如果您检查 InputFileChangeEventArgs
,您可以看到如何获取文件:
public async Task HandleFileSelected(InputFileChangeEventArgs args)
{
IReadOnlyList<Microsoft.AspNetCore.Components.Forms.IBrowserFile> files =
args.GetMultipleFiles(args.FileCount);
// ...
感谢康纳和乔纳斯的回答。问题的原因是旧的 Blazor Server 应用程序是使用 .Net Core 3.1 构建的。 Microsoft.AspNetCore.Components.Forms 命名空间中不包含“InputFile”组件。这解释了为什么我求助于第 3 方“BlazorFileUploader”nuget 包。
在构建新的 Blazor WebAssembly 应用程序时,我选择了 dotnet 5。问题是,标记现在将“InputFile”解析为 Microsoft.AspNetCore.Components.Forms 命名空间而不是 BlazorFileUploader 命名空间。
因此,我可以通过以下两种方式之一进行修复:
- 将标记完全限定为
- 删除第 3 方 nuget 包并重构代码以使用 Microsoft 命名空间的 dotnet5 版本中现在可用的 InputFile 组件
我决定采用这两个选项中的秒数。
我有一个运行正常的简单 Blazor 服务器应用程序。
我正在尝试使用 Blazor WebAssembly 和 dotnet 5 创建一个等效的应用程序。
在工作应用程序中,我有一个 razor 组件,允许用户使用 BlazorFileUploader nuget 包上传文件
标记:
<InputFile multiple OnChange="HandleFileSelected"/>
后面的代码:
public async Task HandleFileSelected(IFileListEntry[] files)
{
if (!ValidateFiles(files, out _errorMsg))
{
return;
}
etc...
当我尝试编译 wasm 应用程序时,出现以下错误
CS1503 参数 2:无法从 'method group' 转换为 'EventCallback'
知道我做错了什么吗?
我认为 OnChange
事件回调不支持 IFileListEntry[]
尝试将您的代码更改为:
public async Task HandleFileSelected(InputFileChangeEventArgs e)
{
var files = e.GetMultipleFiles();
}
乔纳斯是正确的;您的方法需要接受 InputFileChangeEventArgs
而不是 IFileListEntry[]
。如果您将鼠标悬停在 Visual Studio 2019 年的 OnChange
上,您应该会看到如下内容:
事件处理程序需要一个 delegate EventCallback
,最多可以接受 1
个 InputFileChangeEventArgs
类型的参数。将 delegate
视为方法接口:您的 IFileListEntry[]
声明与接口不匹配,因此您收到错误。
如果您检查 InputFileChangeEventArgs
,您可以看到如何获取文件:
public async Task HandleFileSelected(InputFileChangeEventArgs args)
{
IReadOnlyList<Microsoft.AspNetCore.Components.Forms.IBrowserFile> files =
args.GetMultipleFiles(args.FileCount);
// ...
感谢康纳和乔纳斯的回答。问题的原因是旧的 Blazor Server 应用程序是使用 .Net Core 3.1 构建的。 Microsoft.AspNetCore.Components.Forms 命名空间中不包含“InputFile”组件。这解释了为什么我求助于第 3 方“BlazorFileUploader”nuget 包。
在构建新的 Blazor WebAssembly 应用程序时,我选择了 dotnet 5。问题是,标记现在将“InputFile”解析为 Microsoft.AspNetCore.Components.Forms 命名空间而不是 BlazorFileUploader 命名空间。
因此,我可以通过以下两种方式之一进行修复:
- 将标记完全限定为
- 删除第 3 方 nuget 包并重构代码以使用 Microsoft 命名空间的 dotnet5 版本中现在可用的 InputFile 组件
我决定采用这两个选项中的秒数。