ASP.NET Core 6:我试图为Razor页面创建一个IPageFilter,这个过滤器将需要使用在DI容器中注册的ApplicationDbContext.

在我的过滤器中,我在构造函数中注入了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
    }
}

Razor页面:

[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;
    }
}

Program.cs个MVC项目中注册DbContext:

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

intellisense标记用[CustomPageFilterAttribute]装饰PageModel时的错误:

没有给定的参数对应于所需参数 'db'of 'CustomPageFilterAttribute. CustomePageFilterAttribute(ApplicationDbContext)'

推荐答案

编译错误提到你没有向CustomPageFilterAttribute提供参数,并且你的CustomPageFilterAttribute中没有空构造函数.

在您的场景中,您试图从DI容器中获取ApplicationDbContext,因此您必须通过ServiceFilterAttribute实现.

using Microsoft.AspNetCore.Mvc;

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

确保您在Program.cs中注册了CustomPageFilterAttribute.

builder.Services.AddScoped<CustomPageFilterAttribute>();

enter image description here

Csharp相关问答推荐

在命令行中使用时安装,但在单击时不会安装

始终保留数组中的最后N个值,丢弃最老的

C#DateTime.ToString在ubuntu和centos中返回不同的结果

为什么任务需要在内部使用ManualResetEventSlim?

.NET 6控制台应用程序,RabbitMQ消费不工作时,它的程序文件中的S

WeakReference未被垃圾收集

使用可信第三方的Iext8.Net pdf签名

尽管保证密钥不同,但已添加相同密钥的项(&Q;)

在ASP.NET Core Web API项目中通过中间件修改`Request.Path`不会更改使用的控制器/操作

Automapper 12.x将GUID映射到字符串

C#使用TextFieldParser读取.csv,但无法使用";0";替换创建的列表空条目

异步任务导致内存泄漏

如何将MemberInitExpression添加到绑定中其他Lambda MemberInitExpression

当我没有此令牌时,为什么语法报告EOF错误?

工厂类是如何在.NET 8中注册的?

为什么我的属性即使没有显式地设置任何[必需]属性,也会显示验证?

Cmd中的&ping.end()";有时会失败,而";ping";总是有效

ASP.NET Core 8 Web API:如何添加版本控制?

如何在.NET8中使用Blazor Web App(WebAssembly)托管服务器端控制器?

自定义ConsoleForMatter中的DI/Http上下文