无法访问 Blazor Server 3.0 中已处置的对象

Cannot access a disposed object in Blazor Server 3.0

我得到了一个带有以下表单提交按钮的 Blazor 页面

<button type="submit" class="btn btn-primary" @onclick="@(async()=> await OnCreateItem())">Create </button>

调用

protected async Task OnCreateItem()
{
    try
    {

        var result = await dbMgr.CreateAsync(item);
    }
    catch (Exception ex)
    {
         Throws ==> Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling Dispose()...
    }
}

dbMgr被注入页面

@inject DBManager dbMgr;

并且管理器实现为

class DBManager 
{
...
    public DBManager(DBContext db)
    {
         _db = db;
    }

    public async Task<int> CreateAsync(ItemModel obj)
    {
        await _db.AddAsync(obj);
        return await _db.SaveChangesAsync()
    }
}

启动class是

public void ConfigureServices(IServiceCollection services)
{
       services.AddRazorPages();
       services.AddServerSideBlazor();
       services.AddDbContext<DBContext >(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DBContext")),  ServiceLifetime.Scoped);
       services.AddScoped<DBManager>();
 }

我在这里读了类似的问题 Link 1

无果。

不确定我做错了什么。

我没有尝试你的代码,但我想这是由于在

中设置了 type="submit"
<button type="submit" class="btn btn-primary" @onclick="@(async()=> await OnCreateItem())">Create </button>

因此,当您点击 "Create" 按钮时,会发生传统的 post 后退。 .. 也就是说,您的 SPA 应用 post 返回到服务器。它不应该发生(在那种情况下),因为您的应用程序重定向到限制基本 uri 之外的 uri,然后 returns 返回,很遗憾地发现 OnCreateItem 中的对象已死(已处理)。只需设置 type="button".

重要提示:据我回忆,Blazor JavaScript 中应该有代码来防止此类事件:即 post 返回服务器。