我有一个ASP.NET Core 2.1应用程序,其中我正在使用here中解释的身份棚架
现在我有一个用于OnActionExecuting的全局过滤器
generator = CSVGenerator(
csv_data_file='./data_set_retina/train.csv',
csv_class_file='./data_set_retina/class_id_mapping',
batch_size=16
)
然后在startup.cs中,我按如下所示配置了过滤器
public class SmartActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
...
}
}
此过滤器可用于所有操作方法,但不适用于“身份区域”中的方法。如何在“身份区域”中的所有页面上使用全局过滤器?
答案 0 :(得分:3)
在Filters in ASP.NET Core的开始段落中,您将看到以下注释:
重要
该主题不不适用于剃刀页面。 ASP.NET Core 2.1和更高版本支持Razor Pages的IPageFilter和IAsyncPageFilter。有关更多信息,请参见Filter methods for Razor Pages。
这说明了为什么您的SmartActionFilter
实现仅对操作而不对页面处理程序执行。相反,您应该按照注释中的建议实施IPageFilter
或IAsyncPageFilter
:
public class SmartActionFilter : IPageFilter
{
public void OnPageHandlerSelected(PageHandlerSelectedContext ctx) { }
public void OnPageHandlerExecuting(PageHandlerExecutingContext ctx)
{
// Your logic here.
}
public void OnPageHandlerExecuted(PageHandlerExecutedContext ctx)
{
// Example requested in comments on answer.
if (ctx.Result is PageResult pageResult)
{
pageResult.ViewData["Property"] = "Value";
}
// Another example requested in comments.
// This can also be done in OnPageHandlerExecuting to short-circuit the response.
ctx.Result = new RedirectResult("/url/to/redirect/to");
}
}
仍然按照与您的问题所示相同的方式(使用SmartActionFilter
)注册MvcOptions.Filters
。
如果您要同时为动作和页面处理程序运行此程序,则可能需要同时实现IActionFilter
和IPageFilter
。