ASP.NET Core 2.1 中的 Scaffold Identity UI 并添加全局过滤器

我有一个 ASP.NET Core 2.1 应用程序,我在其中使用 Identity 脚手架,如此处所述


现在我有一个 OnActionExecuting 的全局过滤器


public class SmartActionFilter : IActionFilter

{

    public void OnActionExecuting(ActionExecutingContext filterContext)

    {

        ...

    }

}

在 startup.cs 我配置过滤器如下


public void ConfigureServices(IServiceCollection services)

{

    services

        .AddMvc(options =>

        {

            options.Filters.Add(new AddHeaderAttribute("Author", "HaBo")); // an instance

            options.Filters.Add(typeof(SmartActionFilter)); // by type

            // options.Filters.Add(new SampleGlobalActionFilter()); // an instance

        })

        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)

        .AddJsonOptions(options =>

        {

            options.SerializerSettings.ContractResolver = new DefaultContractResolver();

            options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;

        });

}

此过滤器可用于所有操作方法,但不适用于身份区域中的操作方法。如何让全局过滤器对身份区域中的所有页面起作用?


qq_花开花谢_0
浏览 147回答 1
1回答

catspeake

在ASP.NET Core中的过滤器的开头段落中,您将看到以下注释:重要的本主题不适用于 Razor 页面。ASP.NET Core 2.1 及更高版本支持Razor 页面的IPageFilter和IAsyncPageFilter。有关详细信息,请参阅Razor 页面的筛选方法。这解释了为什么您的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)。如果您想为操作和页面处理程序运行它,看起来您可能需要同时实现IActionFilterand IPageFilter。
打开App,查看更多内容
随时随地看视频慕课网APP