65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在 ASP.NET Core MVC 中为 Razor 页面和 Razor 视图创建过滤器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (2投票s)

2018 年 9 月 5 日

CPOL

1分钟阅读

viewsIcon

12576

一个过滤器同时适用于 Razor 视图和页面

引言

我有一个使用 Razor 视图和 Razor 页面的 ASP.NET Core MVC Web 应用程序。 在这种情况下,后者是 Identity 生成的登录和帐户管理页面。 对于所有请求,我希望能够访问请求中的主机域名,以便相应地自定义样式。

背景

过滤器允许你在请求处理之前或之后运行代码。 其中一些是开箱即用的,例如授权。 另一方面,你可以创建自己的自定义过滤器。
我找到了关于在 ASP.NET Core 中添加过滤器的文档。 如 此链接 中所述,适用于 ASP.NET Core MVC 视图的过滤器不适用于 Razor 页面。
对于 Razor 页面,我找到了 此处 的信息。

Using the Code

在这种情况下,我使用异步过滤器,我必须实现 IAsyncActionFilter 接口的 OnActionExecutionAsync 方法,才能将过滤器应用于 Razor 视图

public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
   // before the action executes
   var controller = context.Controller as Controller;
   if (controller == null) return;
   controller.ViewData["Host"] = context.HttpContext.Request.Host.Host;
    
   var resultContext = await next();
   // after the action executes
}

另一方面,对于 Razor 页面,我必须实现 IAsyncPageFilter 接口

public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context,
                                               PageHandlerExecutionDelegate next)
{
   // Called asynchronously before the handler method is invoked, after model binding is complete.
   var page = context.HandlerInstance as PageModel;
   if (page == null) return;
   page.ViewData["Host"] = context.HttpContext.Request.Host.Host;
   var resultContext = await next();
}

public async Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
{
   //Called asynchronously after the handler method has been selected, 
   //but before model binding occurs.  
   await Task.CompletedTask;
}

生成的过滤器是以下类

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace Filters
{
    public class HostFilter: IAsyncActionFilter, IAsyncPageFilter
    {
        public async Task OnActionExecutionAsync
               (ActionExecutingContext context, ActionExecutionDelegate next)
        {
           // before the action executes
            var controller = context.Controller as Controller;
            if (controller == null) return;
            controller.ViewData["Host"] = context.HttpContext.Request.Host.Host;

            var resultContext = await next();

            // after the action executes
        }

        public async Task OnPageHandlerExecutionAsync
               (PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
        {
            // Called asynchronously before the handler method is invoked, 
            // after model binding is complete.
            var page = context.HandlerInstance as PageModel;
            if (page == null) return;
            page.ViewData["Host"] = context.HttpContext.Request.Host.Host;
            var resultContext = await next();
        }

        public async Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
        {
            //Called asynchronously after the handler method has been selected, 
            //but before model binding occurs.
            await Task.CompletedTask;
        }
    }
    }

要在 Startup 类中启用过滤器

services.AddMvc(options =>
{
    options.Filters.Add(new HostFilter());
});

因此,通过这种方式,使用一个过滤器,我们将逻辑应用于在应用程序中处理任何 Razor 视图或页面的之前。

历史

  • 2018 年 9 月 5 日:初始版本
© . All rights reserved.