You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:23:22