【问题标题】:Can't use injected class in Razor Pages code-behind class无法在 Razor Pages 代码隐藏类中使用注入类
【发布时间】:2021-05-24 00:47:31
【问题描述】:

我有一个简单的页面,它只显示电影列表。我在我的页面中注入了DbContext

List.cshtml

@inject MovieContext Db

并尝试在代码隐藏类中使用它:

List.cshtml.cs

public class ListModel : PageModel
{
    public IList<Movie> Movies { get; set; }

    public async Task OnGetAsync()
    {
        Movies = await Db.Movies.ToListAsync();
    }
}

但是,我得到了错误:

当前上下文中不存在名称“Db”

我也尝试使用[Inject] 属性注入上下文,但这也不起作用:

public class ListModel : PageModel
{
    public IList<Movie> Movies { get; set; }

    // Inject context
    [Inject] public MovieContext Db { get;set; }

    public async Task OnGetAsync()
    {
        Movies = await Db.Movies.ToListAsync();
    }
}

我收到以下错误:

NullReferenceException:对象引用未设置为对象的实例。

【问题讨论】:

    标签: asp.net-core dependency-injection razor-pages


    【解决方案1】:

    只需要在代码隐藏类中直接使用依赖注入即可,如下图。

    public class ListModel : PageModel
        {
            private readonly MovieContext _context;
            public ListModel(MovieContext context)
            {
                _context = context;
            }
            public IList<Movie> Movies { get; set; }
    
            public async Task OnGetAsync()
            {
                Movies = await _context.Movies.ToListAsync();
            }
        }
    

    更多详情,您可以查看doc

    【讨论】:

    • 好吧,你只需要不是答案。你没有说明为什么[Inject] 不起作用。
    • 此外,如果我在页面上使用@inject 指令,我仍然没有在我的代码隐藏类中看到这个注入变量(我的问题的开头) .
    • 如果在页面中使用@inject指令,那么只能在页面中使用变量。与代码隐藏类无关。See the doc,如果要在代码隐藏类中注入变量,需要在代码隐藏类中使用构造函数依赖注入,See the doc。跨度>
    • 现在我明白了。奇怪的是我可以在 Blazor 中使用[Inject]
    • @JohnyL InjectAttribute 属于 Blazor。它位于 Microsoft.AspNetCore.Components 命名空间中,基本上是 Blazor。它在 Razor Pages 中没有位置。
    猜你喜欢
    • 2020-06-10
    • 2012-12-21
    • 2021-08-25
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多