首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从ASP.Net Core5 (Razor)的中间件中获取页面模型的类型?

在ASP.Net Core 5 (Razor)中,可以通过中间件来获取页面模型的类型。中间件是ASP.Net Core应用程序处理请求的组件,它可以在请求到达控制器之前或之后执行一些操作。

要从中间件中获取页面模型的类型,可以使用HttpContext对象的GetRouteData()方法来获取当前请求的路由数据。然后,可以通过路由数据中的"page"键来获取当前页面的路径。接下来,可以使用Razor页面编译器来编译页面,并通过反射获取页面模型的类型。

以下是一个示例代码:

代码语言:txt
复制
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Reflection;

namespace YourNamespace
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().AddRazorPagesOptions(options =>
            {
                options.Conventions.Add(new PageModelTypeConvention());
            });
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", async context =>
                {
                    var pageModelType = context.GetRouteData().Values["page"]?.ToString();
                    var pageModel = GetPageModelType(pageModelType);

                    await context.Response.WriteAsync($"Page Model Type: {pageModel}");
                });
            });
        }

        private Type GetPageModelType(string pageModelType)
        {
            var assembly = Assembly.GetExecutingAssembly();
            var razorPagesFeature = new ViewsFeature();
            var pagePath = $"/Pages/{pageModelType}.cshtml";

            var razorViewEngine = new RazorViewEngine(
                new DefaultPageFactoryProvider(razorPagesFeature),
                new DefaultViewLocationCache(razorPagesFeature));

            var viewEngineResult = razorViewEngine.GetView(null, pagePath, false);
            var view = viewEngineResult.View;

            var pageTypeInfo = view.GetType().GetTypeInfo();
            var pageModelTypeInfo = pageTypeInfo.GetProperty("ModelTypeInfo").GetValue(view) as TypeInfo;
            var pageModelType = pageModelTypeInfo.AsType();

            return pageModelType;
        }
    }

    public class PageModelTypeConvention : IPageRouteModelConvention
    {
        public void Apply(PageRouteModel model)
        {
            var pageModelType = model.ViewEnginePath.Replace("/Pages/", "").Replace(".cshtml", "");
            model.RouteValues["page"] = pageModelType;
        }
    }
}

在上述示例中,我们定义了一个Startup类,并在ConfigureServices方法中添加了Razor页面选项。然后,在Configure方法中使用中间件来处理请求,并通过HttpContext对象获取当前页面的路径。接下来,我们使用Razor页面引擎来编译页面,并通过反射获取页面模型的类型。最后,将页面模型类型返回给客户端。

请注意,这只是一个示例代码,具体实现可能会因应用程序的需求而有所不同。此外,为了使示例代码更简洁,省略了错误处理和其他辅助方法的实现。

希望这个答案能够满足你的需求。如果你有任何其他问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ASP.NET Core 5.0 MVC Razor 页面 介绍

显式表达式可用于 .cshtml 文件泛型方法呈现输出。 以下标记显示了如何更正之前出现由 C# 泛型括号引起错误。...@model 指令指定传递到视图或页面模型类型: @model TypeNameOfModel 在 Razor 使用单独用户帐户创建 ASP.NET CORE MVC 或页面应用, Views/...指令: 在 cshtml 文件,指示该文件是一个 Razor 页面。 有关详细信息,请参阅自定义路由和 ASP.NET Core Razor Pages 介绍。...@section指令与MVC 和 Razor 页面布局结合使用,以使视图或页面能够在 HTML 页面的不同部分呈现内容。 有关详细信息,请参阅 ASP.NET Core 布局。... 下面的示例演示如何将模板化 Razor 委托指定为 Func 。 为委托封装方法参数指定动态类型。 将对象类型指定为委托返回值。

38710
  • 如何asp.net core 中间件返回具体页面

    前言 在 asp.net core ,存在着中间件这一概念,在中间件,我们可以比过滤器更早介入到 http 请求管道,从而实现对每一次 http 请求、响应做切面处理,从而实现一些特殊功能 在使用中间件时...,所以本篇文章就来说明如何中间件返回页面,如果你有类似的需求,希望可以对你有所帮助 Step by Step 最终实现功能其实很简单,当用户跳转到某个指定地址后,自定义中间件通过匹配到该路径,...从而返回指定页面,所以这里主要会涉及到中间件如何创建,以及如何处理页面静态文件引用 因为这块并不会包含很多代码,所以这里主要是通过分析 Swashbuckle.AspNetCore 代码,了解它是如何实现这一功能...上找到对应文件夹,clone 下源代码,来看下是如何实现在中间件返回特定页面 在 clone 下代码,排除掉一些 c#、node.js 使用到项目性文件,可以看到整个项目中文件按照功能可以分为三大块.../index.html 时,将嵌入到程序集中文件通过 stream 流形式获取到,转换成字符串,再指定请求响应类型为 text/html,从而实现将页面返回给用户 public async Task

    2K20

    .NET Core 学习资料精选:入门

    Core 选项模式 .Net Core 自定义配置源远程API读取配置(ConfigurationProvider) 迈向现代化 .Net 配置指北(配置到类自动映射) 路由、模型绑定 ASP.NET...路由 ASP.NET Core 模型绑定 ASP.NET Core 自定义模型绑定(IModelBinder) ASP.NET Core URL 重写中间件 依赖注入(IOC、DI) 什么是控制反转...新 Razor 机制 ASP.NET Core Razor SDK ASP.NET Core Razor 语法参考 ASP.NET Core Razor 页面介绍(OnGet、OnPost...、单页多Handler方式) ASP.NET Core Razor 页面的IPageFilter ASP.NET Core Razor 页面的路由和应用约定 ASP.NET Core Razor...[译]ASP.Net Core 2.0Razor Page不是WebForm ASP.NET Core Razor页面简化了 ASP.NET MVC 应用程序 HttpContext ASP.NET

    3.8K20

    ASP.NET Core 基础知识】--MVC框架--Views和Razor语法

    它与Model和Controller协同工作,通过模型绑定Controller获取数据,然后使用Razor语法或其他视图引擎将数据呈现为用户可见HTML。...这个映射过程是自动进行ASP.NET Core框架根据请求数据类型、名称和模型对象属性进行匹配。...支持数据源 模型绑定可以多个数据源获取数据,包括: 查询字符串(Query String): 通过URL查询参数传递数据。...[HttpPost] public IActionResult MyAction([FromForm] string parameter) { // 表单数据获取参数值 } 路由数据: URL...[HttpPost] public IActionResult MyAction([FromBody] MyModel model) { // 请求体获取模型数据 } 模型验证 模型绑定一部分是模型验证

    40720

    net开发高级面试题2021_net面试题2021

    如何Razor 页面实现数据模型绑定? 3.17. Server.Transfer 和 Response.Redirect 区别是什么 3.18....asp.net core 中间件模型也是洋葱模型(和 node.js d Koa 一样) 3.8. application builder use 和 run 方法有什么区别?...作用域服务,一个新请求会创建一个服务实例。使用 add scoped 方法来添加。 3.15. 什么么是 Razor 页面? 是 dot net core 中支持 ASP 网页表格一种开发模型。...@page 作为页面的起始标志。可以看做是 asp.net core 使用模板引擎。 3.16. 如何Razor 页面实现数据模型绑定? 使用 bindproperty 属性。 3.17....什么是装箱(boxing)和拆箱(unboxing) 装箱:类型接口转换到引用类型。 拆箱:引用类型转换到值类型

    3.3K10

    正式开始学习ASP.NET Core 6 Razor Pages 介绍

    它很像MVCRazor视图文件。@page指令指定它是一个 Razor Pages 。@model指令指定模型。该模型是对应PageModel类,如下所示。...ASP.NET Webforms与Razor Pages ASP.NET Core Razor Pages框架是一种新技术,可以通过清晰地分离关注点来更快,更高效地构建以页面为中心Web应用程序。...ASP.NET Core MVC与Razor Pages MVC 是用于实现应用程序用户界面层架构设计模式 Model(模型):包含一组数据类和底层数据源(如数据库)查询数据逻辑。...由于PageModel类和显示模板位于一个位置并且彼此密切相关,因此使用 Razor Pages 构建单个页面非常简单,同时仍使用ASP.NET Core MVC所有体系结构功能,例如依赖项注入,中间件组件...无论您使用ASP.NET Core MVC还是Razor Pages来构建Web应用程序,性能角度来看都没有什么区别。

    3.7K10

    如何使用Serilog.AspNetCore记录ASP.NET Core3.0MVC属性

    我描述了如何配置SerilogRequestLogging中间件以向Serilog请求日志摘要添加其他属性(例如请求主机名或选定端点名称)。...ASP.NET Core团队一直在努力将更多MVC特定功能(例如模型绑定或操作结果)MVC移除,然后“下推”到核心框架。...如果要为选择给定Razor页面记录HandlerName,则需要创建一个自定义IPageFilter。 页面过滤器直接类似于Action过滤器,但它们仅适用于Razor页面。...总结 默认情况下,当用Serilog请求日志记录中间件替换ASP.NET Core基础结构日志记录时,您会丢失一些信息(与开发环境默认配置相比)。...要将与Razor页面相关属性添加到Serilog请求日志,请在IPageFilter中使用IDiagnosticContext相同方法创建和添加属性。

    3.6K10

    如何创建一个自定义`ErrorHandlerMiddleware`方法

    页面异常处理 所有的.NET应用程序都有可能会产生错误,并且不幸地引发异常,因此在ASP.NET中间件管道处理这些异常显得非常重要。...Razor Pages应用程序最终结果是,每当生产中发生异常时,就会返回这个Error.cshtml Razor 页面: ? 这涵盖了razor 页面的异常处理,但是Web API呢?...这没有听起来那么糟糕:即使没有异常处理中间件ASP.NET Core也会在其底层架构捕获该异常,将其记录下来,并向客户端返回一个空白500响应: ?...这是ASP.NET Core 3.x(在某种程度上在2.2版Web API返回错误消息普遍支持方法。 我们将从在静态帮助器类定义UseCustomErrors函数开始。...总结 在这篇文章,我描述了Razor Pages和Web API默认异常处理中间件方法。

    2.2K10

    ASP.NET Core 1.1 简介

    响应缓存中间件会作为ASP.NET MVCOutputCacheAttribute继任者。...Razor视图编译 在ASP.NET MVC之前版本,有一种预编译Web站点方式,这样的话,视图编译就可以在部署阶段执行,而不是在运行期。通过这种方式,能够减少部署后首次加载页面所造成延迟。...要使用中间件作为过滤器,您首先使用Configure方法创建一个类型,该方法指定要使用中间件管道: public class LocalizationPipeline { public void...这样的话,就允许我们在应用启动时候Key Vault secrets获取配置,并将其放在内存之中,从而能够使用正常ASP.NET Core配置抽象来访问配置数据。...这允许您应用程序启动时密钥保险库秘密检索配置并将其保存在内存,使用普通ASP.NET Core配置抽象来访问配置数据。

    2.4K60

    .NET Core 3.0 Preview 6ASP.NET Core和Blazor更新

    在Blazor应用程序,Startup使用标准ASP.NET Core中间件在类配置身份验证和授权。...;Web应用程序Index.cshtml引用脚本文件。...默认用户主体是证书属性构造,其中包含一个允许您补充或替换主体事件。有关如何为证书身份验证配置公共主机所有选项和说明,请参阅文档。...托管gRPC客户端在之前预览,我们依靠Grpc.Core库来获取客户端支持。HttpClient在此预览添加HTTP / 2支持使我们能够引入完全托管gRPC客户端。...*基元(不依赖于ASP.NET核心)ASP.NET应用程序模型(如Worker Services)。在执行服务到服务通信应用程序,我们经常发现大多数服务器也是使用其他服务客户端。

    6K20

    .NET Core 3.0 Preview 6ASP.NET Core和Blazor更新

    选择您用户名以编辑您用户个人资料。 ? 在Blazor应用程序,Startup使用标准ASP.NET Core中间件在类配置身份验证和授权。...要尝试使用Razor类库静态资源: 创建默认ASP.NET Core Web App。...默认用户主体是证书属性构造,其中包含一个允许您补充或替换主体事件。有关如何为证书身份验证配置公共主机所有选项和说明,请参阅文档。...托管gRPC客户端 在之前预览,我们依靠Grpc.Core库来获取客户端支持。HttpClient在此预览添加HTTP / 2支持使我们能够引入完全托管gRPC客户端。...*基元(不依赖于ASP.NET核心)ASP.NET应用程序模型(如Worker Services)。 在执行服务到服务通信应用程序,我们经常发现大多数服务器也是使用其他服务客户端。

    6.7K20

    .NET 云原生架构师训练营(模块二 基础巩固 MVC终结点)--学习笔记

    MVVM ASP.NET Core Razor Pages 介绍:https://docs.microsoft.com/zh-cn/aspnet/core/razor-pages/?...view=aspnetcore-5.0 什么是模型绑定 控制器和 Razor 页面处理来自 HTTP 请求数据。例如,路由数据可以提供一个记录键,而发布表单域可以为模型属性提供一个值。...Razor在方法参数和公共属性向控制器和页面提供数据。 将字符串数据转换为 .NET 类型。 更新复杂类型属性。 来源有哪些 [FromQuery] -查询字符串获取值。...[FromRoute] -路由数据获取值。 [FromForm] -已发布表单字段获取值。 [FromBody] -请求正文中获取值。...什么是模型验证 模型验证特性与消息 FluentValidation 什么是模型验证 ASP.NET Core MVC 和页面模型验证 Razor:https://docs.microsoft.com

    2.5K10

    .NET 云原生架构师训练营(模块二 基础巩固 MVC终结点)--学习笔记

    view=aspnetcore-5.0 什么是模型绑定 控制器和 Razor 页面处理来自 HTTP 请求数据。 例如,路由数据可以提供一个记录键,而发布表单域可以为模型属性提供一个值。...编写代码以检索这些值,并将其字符串转换为 .NET 类型不仅繁琐,而且还容易出错。 模型绑定会自动化该过程。 模型绑定系统: 各种源(如路由数据、表单域和查询字符串)检索数据。...Razor在方法参数和公共属性向控制器和页面提供数据。 将字符串数据转换为 .NET 类型。 更新复杂类型属性。 来源有哪些 [FromQuery] -查询字符串获取值。...[FromRoute] -路由数据获取值。 [FromForm] -已发布表单字段获取值。 [FromBody] -请求正文中获取值。...什么是模型验证 模型验证特性与消息 FluentValidation 什么是模型验证 ASP.NET Core MVC 和页面模型验证 Razor:https://docs.microsoft.com

    2.6K11

    Do You Kown Asp.Net Core -- Asp.Net Core 2.0 未来web开发新趋势 Razor Page

    此次Razor Page是否能带来不一样体验呢,让我们一起来看看吧。 什么是Razor Page     我们都知道在Asp.Net MVCRazor是其一种视图引擎。...如何创建Razor Page 我们可以通过多种方式来创建Razor Page项目,最简单就是利用dotnet命令方式,当然我还是建议您使用Visual Studio 2017(宇宙最强IDE)。...Core –> Asp.Net Core Web应用程序,接下来会弹出一个对话框,让我们选择模板类型: ?...那像原来我们在一个Controller,有Get()和Get(id)表示获取列表和获取单个Item,那在Razor Page如何运用呢?...模型绑定 在Razor Page,数据绑定是非常简单, 您只要在需要绑定属性上添加[BindProperty]特性即可。

    2K60

    《从零开始学ASP.NET CORE MVC》:VS2017创建ASP.NET Core Web程序(三)

    使用Razor页面,编写以页面为中心场景更容易,更高效。当我们不想要ASP.NET MVC完整复杂性时,我们通常使用这种方法。我们可以将其视为MVC框架更薄版本。...我们将在即将发布视频详细讨论Razor Pages。 Razor类库(RCL):顾名思义,我们使用此模板创建可复用Razor类库项目。...该项目包含所有可复用用户界面部分,如数据模型页面模型,控制器,页面Razor视图和View组件。然后,可以在多个应用程序复用此Razor类库(RCL)项目。...任何使用RCL应用程序都可以覆盖它包含视图和页面。我们将在后面发布视频讨论RCL。...在下一篇文章,我们将探索和理解ASP.NET Core 项目文件。 摘要 在本文中,我尝试解释如何使用从头开始创建项目,以及不同类型模板区别。我希望这篇文章可以帮助您满足您需求。

    2.8K30

    《从零开始学ASP.NET CORE MVC》:VS2019创建ASP.NET Core Web程序(三)

    使用Razor页面,编写以页面为中心场景更容易,更高效。当我们不想要ASP.NET MVC完整复杂性时,我们通常使用这种方法。我们可以将其视为MVC框架更薄版本。...我们将在即将发布视频详细讨论Razor Pages。 Razor类库(RCL):顾名思义,我们使用此模板创建可复用Razor类库项目。...该项目包含所有可复用用户界面部分,如数据模型页面模型,控制器,页面Razor视图和View组件。然后,可以在多个应用程序复用此Razor类库(RCL)项目。...任何使用RCL应用程序都可以覆盖它包含视图和页面。我们将在后面发布视频讨论RCL。...在下一篇文章,我们将探索和理解ASP.NET Core 项目文件。 摘要 在本文中,我尝试解释如何使用从头开始创建项目,以及不同类型模板区别。我希望这篇文章可以帮助您满足您需求。

    3.8K20
    领券