【问题标题】:Configuring ASP.NET Core razor page filter using model.Filters.Add<TFilterType>()使用 model.Filters.Add<TFilterType>() 配置 ASP.NET Core razor 页面过滤器
【发布时间】:2018-12-04 07:34:19
【问题描述】:

我可以在启动时设置一个 ASP.NET Core razor 页面过滤器,它使用 &lt;&lt;TType&gt;&gt;() 而不是 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.Add(IConfigurationBuilder, Action)” Startup.cs 71 Active 所需的形式参数“configureSource”相对应的参数

有没有办法只通过model.Filters.Add&lt;Filters.AdminPageFilter&gt;() 指定类型而不通过model.Filters.Add(new Filters.AdminPageFilter()) 创建新实例?

【问题讨论】:

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


    【解决方案1】:

    TypeFilterAttribute 可以提供帮助。它作为过滤器工厂运行,可以使用依赖注入生成过滤器。它实现了IFilterMetadata,因此可以将其添加到model.Filters 来代替您的AdminPageFilter。

    这是一个扩展方法,它可以为您提供相同的 .Add&lt;FilterType&gt; 功能:

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

    【讨论】:

      猜你喜欢
      • 2019-04-09
      • 2020-08-14
      • 2020-08-22
      • 2018-12-20
      • 2019-03-09
      • 1970-01-01
      • 2021-10-27
      • 2019-05-22
      • 1970-01-01
      相关资源
      最近更新 更多