为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
qq_花开花谢_0 2022-06-12 11:09:07
我有一个 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;        });}此过滤器可用于所有操作方法,但不适用于身份区域中的操作方法。如何让全局过滤器对身份区域中的所有页面起作用?
查看完整描述

1 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

在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。


查看完整回答
反对 回复 2022-06-12
  • 1 回答
  • 0 关注
  • 146 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信