使用模型配置 ASP.NET 核心剃须刀页面筛选器。Filters.Add<TFilterType>()



我可以设置ASP。NET核心剃刀页面过滤器在启动时使用<<TType>>()而不是new Type():进行依赖注入

services.AddMvc(options =>
{
options.Filters.Add<Filters.AdminPageFilter>();
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddHttpContextAccessor();

这很好,但我想把它应用到一个目录中,比如:

services.AddMvc().AddRazorPagesOptions(options =>
{
options.Conventions.AddFolderApplicationModelConvention(
"/Admin",
model => model.Filters.Add<Filters.AdminPageFilter>()
);
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

编译抱怨:

错误CS7036没有给定与"ConfigurationExtensions"的必需形式参数"configureSource"相对应的参数。添加(IConfigurationBuilder,操作(Startup.cs 71活动

有没有办法只通过model.Filters.Add<Filters.AdminPageFilter>()指定类型,而不通过model.Filters.Add(new Filters.AdminPageFilter())创建新实例?

TypeFilterAttribute可以帮助实现这一点。它作为一个过滤器工厂运行,可以使用依赖项注入生成过滤器。它实现了IFilterMetadata,因此它可以代替AdminPageFilter添加到model.Filters中。

这里有一个扩展方法,它将为您提供相同的.Add<FilterType>功能:

using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
public static void Add<TFilterType>(this ICollection<IFilterMetadata> filters) where TFilterType : IFilterMetadata {
var typeFilterAttribute = new TypeFilterAttribute(typeof(TFilterType));
filters.Add(typeFilterAttribute);
}

最新更新