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

Posted

技术标签:

【中文标题】ASP.NET Core 2.1 中的 Scaffold Identity UI 并添加全局过滤器【英文标题】:Scaffold Identity UI in ASP.NET Core 2.1 and add Global Filter 【发布时间】:2019-05-13 11:45:19 【问题描述】:

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

现在我有一个用于 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;
        );

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

【问题讨论】:

【参考方案1】:

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

重要

本主题适用于 Razor 页面。 ASP.NET Core 2.1 及更高版本支持 Razor 页面的 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

【讨论】:

有什么方法可以在这里设置 ViewBag 吗?在这个过滤器中? 您无法直接访问ViewBag,但您可以向ViewData 添加属性,这些属性将在页面的cshtml 中使用ViewBag 读取。 这有帮助。希望我也可以从这里控制重定向

以上是关于ASP.NET Core 2.1 中的 Scaffold Identity UI 并添加全局过滤器的主要内容,如果未能解决你的问题,请参考以下文章

从asp.net core 2.1中的控制器访问BackgroundService

ViewData 未传递给 ASP.NET Core 2.1 中的布局

如何在 ASP.NET Core 2.1 中的计时器上运行 BackgroundService

ASP.NET Core 2.1 中的数据保护仅适用于一台机器

共享布局视图不适用于 ASP.NET Core 2.1 中的所有视图

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