You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 5(Razor)中如何从中间件获取Page Model的类型

Razor页面自定义中间件获取Page Model类型方案

核心前提:调整中间件注册顺序

你之前拿不到端点相关信息,大概率是中间件注册顺序不对。必须将你的自定义中间件放在UseRouting()之后、UseAuthorization()/MapRazorPages()之前,路由系统会在UseRouting()执行时完成端点解析,此时才能拿到Razor页面对应的元数据。
注册示例:

var builder = WebApplication.CreateBuilder(args);
// 其他服务注册逻辑
builder.Services.AddRazorPages();

var app = builder.Build();
// 异常处理、静态文件、Https跳转等基础中间件
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseExceptionHandler("/Error");

app.UseRouting(); // 路由解析,填充Endpoint信息

// 你的自定义中间件注册位置
app.UseMiddleware<RazorPageCheckMiddleware>();

app.UseAuthorization();
app.MapRazorPages();

app.Run();

中间件获取Page Model与特性校验实现

从已解析的端点元数据中提取PageActionDescriptor对象,即可直接获取对应Page Model的类型,再做[AllowAnonymous]特性判断即可:

using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Authorization;

public class RazorPageCheckMiddleware
{
    private readonly RequestDelegate _next;

    public RazorPageCheckMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var endpoint = context.GetEndpoint();
        if (endpoint == null)
        {
            await _next(context);
            return;
        }
        // 提取Razor页面专属描述符
        var pageDescriptor = endpoint.Metadata.GetMetadata<PageActionDescriptor>();
        // 非Razor页面请求直接跳过
        if (pageDescriptor == null)
        {
            await _next(context);
            return;
        }
        // 获取Page Model类型
        var pageModelType = pageDescriptor.ModelTypeInfo.AsType();
        // 判断是否标记了[AllowAnonymous]
        bool isAllowAnonymous = Attribute.IsDefined(pageModelType, typeof(AllowAnonymousAttribute));

        if (!isAllowAnonymous)
        {
            // 此处直接复用你现有中间件的校验逻辑即可,无需改造为过滤器
        }

        await _next(context);
    }
}

注意事项

  • 非Razor页面的请求(如静态资源、Web API接口)不会进入你的专属校验逻辑,不会影响现有其他功能
  • 如果需要读取Razor页面的路由规则、相对路径等信息,也可以直接从pageDescriptor的对应属性中获取
  • 若你的[AllowAnonymous]是标记在Razor页面的@attribute指令中而非Page Model类上,只需把上述校验的ModelTypeInfo替换为PageTypeInfo即可

内容的提问来源于stack exchange,提问作者Lázár Zsolt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:57:03