Asp.net Core Razor Pages 中等效的 ActionFilter
ActionFilter equivalent in Asp.net Core Razor Pages
首先,我知道 asp.net 核心剃须刀中没有动作过滤器 pages.But 我正在寻找一种类似的机制。
我想要实现的是基于处理程序 methods.When 应用过滤器 我尝试使用 pagefilter,它应用于所有 methods.Is 那里任何 method/way 以排除同一页面上的某些处理程序方法?
为了澄清问题,我添加了一些示例。
这是示例页面过滤器
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.How 我可以实现该行为吗?
传递给 OnPageHandlerExecutionAsync
的 PageHandlerExecutingContext
参数提供了实现此目的所需的一切。这是一个显示细节的示例:
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;
// ...
}
首先,我知道 asp.net 核心剃须刀中没有动作过滤器 pages.But 我正在寻找一种类似的机制。 我想要实现的是基于处理程序 methods.When 应用过滤器 我尝试使用 pagefilter,它应用于所有 methods.Is 那里任何 method/way 以排除同一页面上的某些处理程序方法?
为了澄清问题,我添加了一些示例。
这是示例页面过滤器
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.How 我可以实现该行为吗?
传递给 OnPageHandlerExecutionAsync
的 PageHandlerExecutingContext
参数提供了实现此目的所需的一切。这是一个显示细节的示例:
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;
// ...
}