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






4.67/5 (2投票s)
一个过滤器同时适用于 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 日:初始版本