ASP.NET Core 2.1中的Scaffold Identity UI,并添加全局筛选器

时间:2018-12-12 11:16:37

标签: c# asp.net asp.net-core asp.net-identity

我有一个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)
    {
        ...
    }
}

此过滤器可用于所有操作方法,但不适用于“身份区域”中的方法。如何在“身份区域”中的所有页面上使用全局过滤器?

1 个答案:

答案 0 :(得分:3)

Filters in ASP.NET Core的开始段落中,您将看到以下注释:

  

重要

     

该主题不适用于剃刀页面。 ASP.NET Core 2.1和更高版本支持Razor Pages的IPageFilterIAsyncPageFilter。有关更多信息,请参见Filter methods for Razor Pages

这说明了为什么您的SmartActionFilter实现仅对操作而不对页面处理程序执行。相反,您应该按照注释中的建议实施IPageFilterIAsyncPageFilter

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

如果您要同时为动作页面处理程序运行此程序,则可能需要同时实现IActionFilterIPageFilter