Blazor 怎么使用 IndexedDB

月夜之吻
发布: 2025-12-15 08:01:21
原创
454人浏览过
Blazor 通过 JavaScript 互操作调用 IndexedDB,需在 JS 中封装 initDb、add、get 等方法并返回 Promise,C# 端用 IndexedDbService 封装调用,注意版本升级、事务短暂、错误监听及存储限制。

blazor 怎么使用 indexeddb

Blazor 本身不直接提供 IndexedDB API,但可以通过 JavaScript 互操作(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>

给表格加链接
给表格加链接

给表格加链接,一般我们是不怎么使用表格的,但是有些时候我们会有这块的需求,企业网站或商城网站都可以使用,给表格加上链接,需要通过js来控制,php中文网推荐下载!

给表格加链接 34
查看详情 给表格加链接

组件中使用:

@inject IndexedDbService Db
<p>@code {
private async Task SaveUser()
{
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的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号