c# - Asp.net Core Razor 页面中的 ActionFilter 等效项
问题描述
首先,我知道 asp.net core razor pages 中没有 Action Filter。但我正在寻找一种类似的机制。我想要实现的是基于处理程序方法应用过滤器。当我尝试使用页面过滤器时,它适用于所有方法。是否有任何方法/方式可以在同一页面上排除某些处理程序方法?
为了澄清问题,我添加了一些示例。
这是示例页面过滤器
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。如何实现该行为?
解决方案
PageHandlerExecutingContext
传入的参数OnPageHandlerExecutionAsync
提供了实现此目的所需的一切。这是一个显示细节的示例:
public async Task OnPageHandlerExecutionAsync(
PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
{
if (context.HandlerMethod?.Name == "Update")
{
// Running inside a handler method named "Update".
}
// ...
}
HandlerMethod
null
在执行处理程序方法时为非。它提供了这些可能感兴趣的属性:
HttpMethod
,例如PUT
,POST
Name
,例如Edit
,Update
MethodInfo
或者,如果您想在处理程序级别选择退出,您可以使用自定义属性并检查它是否存在于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;
// ...
}
推荐阅读
- node.js - 通过nodejs重新流式传输icecast流
- java - 如何避免连续两次生成相同的 2 个随机数
- c - 如何在设置C环境之前在uboot中使用汇编编写控制台(或就像printf()函数)?
- angular - 角度翻译插件没有启动
- postgresql - Sequelize Migration addIndex不按降序添加索引
- maven - 如何隔离多个共享的 Maven 存储库配置?
- ruby-on-rails - 复制表结构和除一个以外的所有索引 - postgres
- python - 返回属于多个组成员的名称列表,数据馈送与上一个问题不同
- opengl - 如何将 ueyesrc 缓冲区转换为 opengl 纹理?
- python - 从值和值计数的数据集中构造一个列表