我最终采用了不需要 NavigationManager 的另一种方法。它部分地来自于微软文档
这里。在我的情况下,我需要呈现一个 Excel 文件(使用 EPPlus),但这并不重要。我只需要返回一个流以获取我的结果。
在我的 Blazor 页面或组件上,当点击按钮时:
public async Task GenerateFile()
{
var fileStream = ExcelExportService.GetExcelStream(exportModel);
using var streamRef = new DotNetStreamReference(stream: fileStream);
await jsRuntime.InvokeVoidAsync("downloadFileFromStream", "Actual File Name.xlsx", streamRef);
}
GetExcelStream
的代码如下:
public static Stream GetExcelStream(ExportModel exportModel)
{
var result = new MemoryStream();
ExcelPackage.LicenseContext = LicenseContext.Commercial;
var fileName = @$"Gets Overwritten";
using (var package = new ExcelPackage(fileName))
{
var sheet = package.Workbook.Worksheets.Add(exportModel.SomeUsefulName);
var rowIndex = 1;
foreach (var dataRow in exportModel.Rows)
{
...
...
}
sheet.Cells.AutoFitColumns();
package.SaveAs(result);
}
result.Position = 0;
return result;
}
这个 JavaScript
在上面的链接中,但是我在这里添加它作为我唯一需要的东西。
window.downloadFileFromStream = async (fileName, contentStreamReference) => {
const arrayBuffer = await contentStreamReference.arrayBuffer();
const blob = new Blob([arrayBuffer]);
const url = URL.createObjectURL(blob);
const anchorElement = document.createElement("a");
anchorElement.href = url;
anchorElement.download = fileName ?? "";
anchorElement.click();
anchorElement.remove();
URL.revokeObjectURL(url);
}