首先,我知道在asp.net core razor页面中没有Action Filter,但我正在寻找一种类似的机制,我试图实现的是基于处理程序方法的过滤,当我尝试使用pagefilter时,它被应用于所有方法,有什么方法可以排除同一页面中的一些处理程序方法?
为了澄清问题,我添加了一些例子。
下面是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
}
}
这里是一个处理方法的例子,我想让我的过滤器应用于OnPostUpdate,而不应用于OnPostEdit。
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;
// ...
}