首页
学习
活动
专区
工具
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 。 为委托封装的方法的参数指定动态类型。 将对象类型指定为委托的返回值。

46210
  • 如何在 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

    2.1K20

    .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.0中的Razor 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) { // 从请求体中获取模型数据 } 模型验证 模型绑定的一部分是模型验证

    54820

    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

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

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

    3.6K10

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

    它很像MVC中的Razor视图文件。@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.8K10

    如何创建一个自定义的`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

    .NET Core 3.0 Preview 6中对ASP.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 6中对ASP.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

    ASP.NET Core 1.1 简介

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

    2.4K60

    .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 MVC中,Razor是其一种视图引擎。...如何创建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应用的错误处理:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”

    中间件则是面向最终用户的,我们可以利用它来显示一个友好的定制化的错误页面。...,我们可以从当前HttpContext中提取这个ExceptionHandlerFeature对象,进而获取抛出的异常和原始的请求路径。...在这个方法中,我们正式借助于这个ExceptionHandlerFeature特性得到抛出的异常,并将它的类型、消息以及堆栈追踪显示出来。...那么对于任意从浏览器发出的请求,都会得到如下图所示的错误页面。 ?...Core应用的错误处理[1]:三种呈现错误页面的方式 ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件 ASP.NET Core应用的错误处理

    1.4K90

    【译】.NET Core 3.0 Preview 3中关于ASP.NET Core的更新内容

    另请参阅ASP.NET Core 3.0 中的重大更改的完整列表。 Razor组件改进 在前面的预览中,我们介绍了Razor组件,这是一种用ASP.NET核心构建交互式客户端Web UI的新方法。...所编写的Razor组件位于托管它们的ASP.NET Core应用程序中。同一个ASP.NET Core项目可以包含Razor组件、页面和视图。...在Razor组件模板中,所有组件文件现在都使用.razor扩展名。Razor页面和视图仍然使用.cshtml扩展名。...Razor组件在HTML中是完全呈现的。 Razor类库中的Razor组件 现在可以将Razor组件添加到Razor类库中,并使用Razor组件从ASP.NET核心项目引用它们。...在本节中,我们将展示如何创建一个新的Angular或React模板,该模板允许我们对用户进行身份验证并访问受保护的API资源。

    22.7K10
    领券