新闻中心

Blazor 怎么使用 IndexedDB

2025-12-15
浏览次数:
返回列表
Blazor 通过 J*aScript 互操作调用 IndexedDB,需在 JS 中封装 initDb、add、get 等方法并返回 Promise,C# 端用 IndexedDbService 封装调用,注意版本升级、事务短暂、错误监听及存储限制。

blazor 怎么使用 indexeddb

Blazor 本身不直接提供 IndexedDB API,但可以通过 J*aScript 互操作(JS Interop)在 Blazor WebAssembly 或 Blazor Server(需启用 JS 支持)中调用浏览器原生的 IndexedDB。核心思路是:C# 调用 JS 封装好的数据库操作函数,由 JS 层完成打开数据库、建表、事务、增删改查等全部逻辑。

准备基础 JS 封装

wwwroot/js/indexedDb.js 中写一个轻量封装,暴露清晰的方法接口:

  • initDb(name, version):初始化或升级数据库,自动创建 objectStore 和索引
  • add(storeName, data, key):向指定 store 添加数据
  • get(storeName, key):按主键查询单条
  • getAll(storeName):获取全部记录
  • delete(storeName, key):删除单条
  • searchByIndex(storeName, indexName, value):按索引快速查找

注意:所有方法都返回 Promise,确保与 C# 的 await 兼容。

在 Blazor 中注入并调用

创建一个 C# 服务类统一管理 JS 引用:

public class IndexedDbService
{
    private readonly IJSRuntime _jsRuntime;
    private IJSObjectReference _module;
<pre class="brush:php;toolbar:false;">public IndexedDbService(IJSRuntime jsRuntime) => _jsRuntime = jsRuntime;

public async Task InitializeAsync() =>
    _module = await _jsRuntime.InvokeAsync<IJSObjectReference>(
        "import", "./js/indexedDb.js");

public async Task AddAsync(string storeName, object data, object key = null) =>
    await _module.InvokeVoidAsync("add", storeName, data, key);

public async Task<T> GetAsync<T>(string storeName, object key) =>
    await _module.InvokeAsync<T>("get", storeName, key);

public async Task<T[]> GetAllAsync<T>(string storeName) =>
    await _module.InvokeAsync<T[]>("getAll", storeName);

}

Program.cs 中注册为 scoped 服务:
builder.Services.AddScoped<indexeddbservice>();</indexeddbservice>

风车Ai翻译 风车Ai翻译

跨境电商必备AI翻译工具

风车Ai翻译 407 查看详情 风车Ai翻译

组件中使用:

@inject IndexedDbService Db
<p>@code {
private async Task S*eUser()
{
await Db.InitializeAsync();
await Db.AddAsync("users", new { id = 1, name = "Alice", email = "a@example.com" });
}</p><pre class="brush:php;toolbar:false;">private async Task LoadUsers()
{
    var users = await Db.GetAllAsync<dynamic>("users");
    foreach (var u in users)
        Console.WriteLine(u.name);
}

}

关键注意事项

IndexedDB 在 Blazor 中不是“开箱即用”,容易踩坑:

  • 版本升级必须显式触发:修改 objectStore 结构(如加字段、建新索引)时,要提高数据库版本号,并在 onupgradeneeded 中重建 schema
  • 事务生命周期极短:JS 层每次操作都要新开事务,不能跨 await 持有 transaction 对象
  • 二进制数据支持好:可直接存 BlobArrayBuffer(比如图片),但 .NET 端传入需转为 base64 或 byte[] 后再交由 JS 处理
  • 错误必须监听:JS 层每个 request 都要绑定 onerror,否则失败静默,C# 端收不到异常
  • 存储上限因浏览器而异:Chrome 通常允许数百 MB,Safari 较保守(约 50–100MB),大文件建议分块或配合 Service Worker 缓存

替代方案参考

如果只是存用户设置、token、小对象,localStorage 更简单高效;若需离线同步、多条件查询、大量结构化数据(如待办列表+附件+标签+时间范围筛选),IndexedDB 是唯一合理选择。也可组合使用:用 localStorage 存访问令牌,用 IndexedDB 存业务数据。

基本上就这些。

以上就是Blazor 怎么使用 IndexedDB的详细内容,更多请关注其它相关文章!


# 离线  # 青岛网站优化现状  # seo技巧100种推广  # 淘宝上的seo原理  # 博物馆推广网站大全图片  # 上海建科建设监理网站  # 淄川互联网营销推广中心  # 祖庙网站优化查询  # 网站优化位置  # 鞍山网站建设与维护介绍  # 烟台互联网营销推广  # 并在  # 令牌  # 如何在  # javascript  # 数据格式  # 单条  # 操作指南  # 都要  # 文档  # 如何处理  # .net  # c#  # ai  # safari  # 浏览器  # js  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 《GTA6》开发画面疑似泄露!这次可不是AI了  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  Python异步编程实践:使用Binance API构建实时交易数据流  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  ArrayList与LinkedList核心操作的Big-O复杂度分析  腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程  处理嵌套交互式控件:前端可访问性指南  Promise错误处理:在catch后终止链式then执行的策略  qq游戏免费畅玩入口_qq游戏电脑版快速启动  MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  python3时间如何用calendar输出?  QQ邮箱正确登录入口_QQ邮箱官方网站使用地址  必由学在线入口 必由学网页版快速登录入口  html5 app怎么运行环境_配html5 app运行环境【教程】  J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题  知音漫客官网漫画下载_知音漫客网页版阅读记录  网站内容防复制粘贴的实现策略与局限性  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  小红书网页版入口链接分享 小红书官网直接进  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  css滚动动画效果怎么实现_使用Animate.css滚动触发动画类  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  必由学官网快捷入口 必由学网页版在线学习平台  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  css绝对定位元素脱离父容器怎么办_确保父元素position非static  J*aScript打印功能_j*ascript输出控制  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  微信聊天记录怎么加密_微信聊天记录加密方法  苹果手机如何防止被恶意App追踪  蛙漫安全无毒 官方认证的绿色入口  DLsite中文平台入口 DLsite官网内容在线查看  J*aScript动态修改指定div内所有a标签样式指南  J*a实现学校排课程序_面向对象结构化项目示例  一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰  抖音怎么赚钱_抖音创作者变现方法与途径指南  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  微信网页版扫码登录入口 微信网页版二维码登录入口  实现全屏滚动与导航点:专业教程  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  Steam官网入口直达 Steam注册及登录步骤  可靠CSGO开箱平台解析 CSGO开箱网合集  Golang如何实现状态模式管理对象状态_Golang State模式实现技巧  steam官方网页快速访问 steam账号注册全流程  QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口  如何使用 Excel 发布器与 Power BI 分享 Excel 洞察 

搜索