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)'"
编译错误提到您没有向
CustomPageFilterAttribute
提供参数,并且 CustomPageFilterAttribute
中没有空构造函数。
在您的场景中,您尝试从 DI 容器获取
ApplicationDbContext
,因此您必须通过 ServiceFilterAttribute 实现。
using Microsoft.AspNetCore.Mvc;
[ServiceFilter(typeof(CustomPageFilterAttribute))]
public class ConfigUsuarioModel : PageModel
{
...
}
确保您在
Program.cs中注册
CustomPageFilterAttribute
。
builder.Services.AddScoped<CustomPageFilterAttribute>();