重定向页面时获取System.ObjectDisposedException

时间:2018-09-06 07:55:47

标签: c# asp.net-core entity-framework-core razor-pages

更新:问题是OnGet方法是异步的。谢谢大家的帮助和投入!

在我的第一页(主页)中,我获得了用户列表:

HomePageModel:

public async void OnGetAsync()
    {
            var everything = await _context.Users.ToListAsync();
            GetUsers = everything;
    }

然后,我在页面上创建一个用户列表,并创建一个链接,该链接重定向到包含另一个用户下注列表的页面:

主页:

<ul class="list-group">
@foreach (var user in Model.GetUsers)
{
<li class="list-group-item">
    //Irrelevant stuff
    <a asp-page="./UserBets" asp-route-id="@user.Id">View Bets</a>
</li>
}
</ul>

重定向到UserBets,这是UserBetsModel:

public async void OnGetAsync(string Id)
    {
        if (Id != null)
        {   //Debugging             
            Message += Id;
            using (var db = _context)
            {
                var everything = await _db.Bet.Where(a => a.UserId == Id).Select(s => s.MatchId).SingleAsync();
                GetBets = everything;
            }
        }            
    }

到达那里时,我收到一条消息,提示:

  

System.ObjectDisposedException:'无法访问已处置的对象。导致此错误的常见原因是,处理从依赖项注入中解决的上下文,然后稍后尝试在应用程序中的其他位置使用相同的上下文实例。如果在上下文上调用Dispose()或将上下文包装在using语句中,则可能会发生这种情况。如果使用依赖项注入,则应让依赖项注入容器负责处理上下文实例。   对象名称:“ AsyncDisposer”。

我试过不用范围,在两个页面模型上都使用了范围。 问题是我在这里并不真正理解问题,所以很抱歉,如果我没有为您提供足够的上下文或代码,而是询问您是否需要更多。

我想做的是打印出用户投注清单。 预先感谢!

1 个答案:

答案 0 :(得分:2)

using (var db = _context)
{
    var everything = await _context.Bet.Where(a => a.UserId == Id).Select(s => s.MatchId).SingleAsync();
    GetBets = everything;
}

您的using将在_context行之后立即处置GetBets = everything;。问题是_context不属于您的方法,因此使用_context的任何其他代码都将发现它已处置。我想您在其他地方也可以使用类似的代码来处理它,这可能就是为什么此问题在此处出现。

在不再使用共享对象之前,不要处理它们(通常是在包含类被销毁时-您应该在父类上添加自己的IDisposable实现)。