无法访问 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 返回服务器。
我得到了一个带有以下表单提交按钮的 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 返回服务器。