Blazor WASM中如何在内存生成并下载JSON文件(无需使用JS)
Blazor WASM中如何在内存生成并下载JSON文件(无需使用JS)
嘿,这个需求我之前刚踩过坑并搞定了,完全不用碰JS就能实现!下面给你一步步拆解怎么做:
首先,核心思路就是把你的类实例序列化后转成内存里的字节流,再通过Blazor自带的服务触发浏览器的下载行为,全程用C#搞定。
具体实现步骤(分版本推荐)
方案一:适用于所有.NET版本(通用写法)
- 先在你的Blazor组件里注入
NavigationManager,这是Blazor用来处理导航的核心服务,我们用它来触发下载:
@inject NavigationManager NavManager
- 写一个下载方法,逻辑清晰易懂:
private void DownloadJsonFile() { // 1. 实例化你的业务类(这里用MyClass代替你实际的类) var myData = new MyClass { Id = 1, Name = "测试数据", Description = "这是内存生成的JSON内容" }; // 2. 把类实例序列化成格式化后的JSON字符串 string jsonString = JsonSerializer.Serialize(myData, new JsonSerializerOptions { WriteIndented = true }); // 3. 将JSON字符串转成UTF8字节数组 byte[] jsonBytes = Encoding.UTF8.GetBytes(jsonString); // 4. 转成Base64字符串,用来构造浏览器能识别的下载链接 string base64Json = Convert.ToBase64String(jsonBytes); // 5. 构造下载用的Data URI,指定MIME类型为JSON string downloadUrl = $"data:application/json;charset=utf-8;base64,{base64Json}"; // 6. 触发下载:forceLoad:true确保浏览器把这个链接当成下载而非页面导航 NavManager.NavigateTo(downloadUrl, forceLoad: true); }
- 最后在组件里加个按钮触发方法就行:
<button @onclick="DownloadJsonFile">点击下载JSON文件</button>
方案二:适用于.NET 7及以上(更简洁的官方方案)
如果你的项目用的是.NET 7或更高版本,Blazor官方提供了更友好的DownloadAsync方法,能直接指定文件名,不用自己拼Base64:
private async Task DownloadJsonFile() { var myData = new MyClass { Id = 1, Name = "测试数据" }; string jsonString = JsonSerializer.Serialize(myData, new JsonSerializerOptions { WriteIndented = true }); byte[] jsonBytes = Encoding.UTF8.GetBytes(jsonString); // 用MemoryStream包装字节数组 using var stream = new MemoryStream(jsonBytes); // 直接调用DownloadAsync,指定文件名和流,浏览器会自动用这个名字保存 await NavManager.DownloadAsync("我的数据文件.json", stream); }
小补充
WriteIndented = true是让JSON格式化后更易读,要是追求文件体积可以去掉这个配置;- 如果是超大JSON文件,Base64方式可能会有性能局限,但日常业务场景下完全够用;
- 两种方案都完全不需要写任何JavaScript代码,纯C#就能搞定你的需求。
备注:内容来源于stack exchange,提问作者javirs
相关产品推荐
相关产品推荐

