代码之家  ›  专栏  ›  技术社区  ›  erhan355

与Asp中的ActionFilter等效。网络核心剃须刀页面

  •  -1
  • erhan355  · 技术社区  · 6 年前

    首先,我知道asp中没有动作过滤器。net核心剃须刀页面。但我正在寻找一种类似的机制。 我试图实现的是基于处理程序方法应用过滤器。当我尝试使用pagefilter时,它适用于所有方法。是否有任何方法/方式可以排除同一页面上的某些处理程序方法?

    为了澄清这个问题,我添加了一些例子。

    下面是页面过滤器的例子

    public class FormValidatorRazor : IAsyncPageFilter
    {
        public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
        {
            if (context.HttpContext.Request.Method.Equals("POST") || context.HttpContext.Request.Method.Equals("PUT"))
            //code removed for brevity
     }
    

    以下是我如何将其应用到项目中

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages().AddMvcOptions(options =>
        {
            options.Filters.Add(new FormValidatorRazor());
            //code removed for brevity
        }
    }
    

    下面是示例处理程序方法。

    public async Task<IActionResult> OnPostUpdate(ExModel model)
    {
    }
    
    public async Task<IActionResult> OnPostEdit(ExModel model)
    {
    }
    

    我希望我的过滤器应用于OnPostUpdate,而不是OnPostEdit。我该如何实现这种行为?

    0 回复  |  直到 6 年前
        1
  •  2
  •   Kirk Larkin    6 年前

    这个 PageHandlerExecutingContext 参数传递给 OnPageHandlerExecutionAsync 提供实现这一目标所需的一切。下面是一个具体的例子:

    public async Task OnPageHandlerExecutionAsync(
        PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
    {
        if (context.HandlerMethod?.Name == "Update")
        {
            // Running inside a handler method named "Update".
        }
    
        // ...
    }
    

    HandlerMethod 是非- null 当执行处理程序方法时。它提供了这些可能感兴趣的属性:

    或者,如果你想退出 处理者 级别,您可以使用自定义属性并检查其是否存在 OnPageHandlerExecutionAsync :

    public class SomePageFilterExcludeAttribute : Attribute { }
    

    [SomePageFilterExclude]
    public void OnPostUpdate() { }
    

    public async Task OnPageHandlerExecutionAsync(
        PageHandlerExecutingContext ctx, PageHandlerExecutionDelegate next)
    {
        var isHandlerExcluded = ctx.HandlerMethod?.MethodInfo?.
            GetCustomAttributes(typeof(SomePageFilterExcludeAttribute), false).Any() == true;
    
        // ...
    }