ASP.NET Core:如何在IPageFilter中注入ApplicationDbContext

问题描述 投票:0回答:1

ASP.NET Core 6:我正在尝试为 Razor 页面创建

IPageFilter
,此过滤器需要使用在
ApplicationDbContext
的 DI 容器中注册的
program.cs

在我的过滤器中,我在构造函数中注入

ApplicationDbContext
,但是当我用它装饰 Razor 页面时,它显示错误,表明我没有注入上下文...执行此操作的正确方法是什么?

过滤器:

[AttributeUsage(AttributeTargets.Class)]
public class CustomPageFilterAttribute : Attribute, IAsyncPageFilter 
{
    protected ApplicationDbContext _db;

    public CustomPageFilterAttribute(ApplicationDbContext db) 
    {
        _db = db;
    }

    public Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context) 
    {
        var something = _db.Customers.Find(1);
        return Task.CompletedTask;
    }

    // Executes last
    public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next) 
    {
        // Before action execution
        await next();
        // After action execution
    }
}

剃刀页面:

[CustomPageFilterAttribute]
public class ConfigUsuarioModel : PageModel
{
    private readonly ApplicationDbContext _db;

    [BindProperty]
    public ConfigUsuario _configUsuario { get; set; }

    [TempData]
    public string StatusMessage { get; set; }

    //ctor
    public ConfigUsuarioModel(ApplicationDbContext db) 
    {
        _db = db;
    }
}

在MVC项目的program.cs中注册dbcontext:

    builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(connectionString, sqlServerOptions => sqlServerOptions.CommandTimeout(90)));

Intellisense 在使用

[CustomPageFilterAttribute]
装饰 PageModel 时标记了错误:

“没有给出与所需参数相对应的参数 “数据库”的 'CustomPageFilterAttribute.CustomePageFilterAttribute(ApplicationDbContext)'"

c# asp.net-core .net-6.0 razor-pages
1个回答
0
投票

编译错误提到您没有向

CustomPageFilterAttribute
提供参数,并且
CustomPageFilterAttribute
中没有空构造函数。

在您的场景中,您尝试从 DI 容器获取

ApplicationDbContext
,因此您必须通过 ServiceFilterAttribute 实现。

using Microsoft.AspNetCore.Mvc;

[ServiceFilter(typeof(CustomPageFilterAttribute))]
public class ConfigUsuarioModel : PageModel
{
    ...
}

确保您在

Program.cs
中注册 CustomPageFilterAttribute

builder.Services.AddScoped<CustomPageFilterAttribute>();

© www.soinside.com 2019 - 2024. All rights reserved.