Blazor安全邮件项目EventCallback.FromDelegate报错求助
问题解决方案:EventCallback报错与FileEdit事件绑定修正
1. 核心报错修复
直接移除Razor代码中错误的EventCallback<ChangeEventArgs>.FromDelegate(OnChanged)写法,将Changed事件直接绑定到你的OnChanged方法即可:
<FileEdit @ref="fileEdit" Placeholder="Upload pdf or xlsx files that are not more than 5MB each..." AutoReset="false" Multiple Changed="OnChanged" <!-- 直接绑定方法名 --> Filter=".pdf, .xlsx" MaxFileSize="5000000" />
错误原因:
- Blazor的
EventCallback<T>类型没有FromDelegate静态方法,框架会自动将签名匹配的方法包装为EventCallback,无需手动创建。 - 你误用了
ChangeEventArgs类型:FileEdit组件的Changed事件传递的是FileChangedEventArgs,和你修改后的OnChanged方法签名匹配,不需要指定ChangeEventArgs。
2. 完善OnChanged方法逻辑
你修改后的OnChanged方法已修正签名,但原加密逻辑存在多处问题,以下是修正后的版本:
private async Task OnChanged(FileChangedEventArgs e) { try { foreach (var file in e.Files) { using var stream = file.OpenReadStream(5000000); // 限制流大小为设置的MaxFileSize var memoryStream = new MemoryStream(); await stream.CopyToAsync(memoryStream); memoryStream.Position = 0; // 重置流指针,确保后续操作能正确读取 if (file.Type.Contains("pdf", StringComparison.OrdinalIgnoreCase)) { await EncryptPdf(memoryStream, file); } else if (file.Type.Contains("xlsx", StringComparison.OrdinalIgnoreCase)) { // 修正:xlsx文件调用对应加密方法,而非EncryptPdf await EncryptXlsx(memoryStream, file); } else { _toastService?.ShowWarning("Only PDF and XLSX files are supported."); await fileEdit.Reset().AsTask(); return; } // 将加密后的文件添加到附件 memoryStream.Position = 0; EmailMessageDetails.Attachments.Add(new Attachment { FileName = $"Protected_doc_{file.Name}", FileContent = memoryStream.ToArray() }); } StateHasChanged(); } catch (Exception exc) { _toastService?.ShowError("An error occurred while processing your request"); await fileEdit.Reset().AsTask(); } }
关键修正点:
- 限制读取流的大小为配置的
MaxFileSize,避免内存溢出。 - 重置内存流位置,确保加密方法和后续读取能正确操作流。
- 修正xlsx分支的加密方法调用(原代码错误调用
EncryptPdf)。 - 修复原代码中缺少
else的语法错误,确保仅非支持文件类型触发警告。 - 添加异常处理中的重置操作,避免错误状态残留。
3. 额外注意事项
- 确保
EncryptPdf和EncryptXlsx方法能正确处理传入的内存流,加密后需重置流位置。 - 避免使用本地
FileStream存储加密文件,直接操作内存流更符合Blazor Web应用场景,减少IO开销。
内容的提问来源于stack exchange,提问作者Aubrey Xaba
相关产品推荐
相关产品推荐

